내 목표는 .NET 문자열 (유니 코드)을 Windows-1252로 변환하고 필요한 경우 Base64 엔터티에 원래 UTF-8 문자열을 저장하는 것입니다.Windows-1252 문자열과 UTF-8 문자열 비교
예를 들어 1252로 변환 된 "DJ Doena"문자열은 여전히 "DJ Doena"입니다.
그러나 나무 (木)의 일본어 간지를 1251로 변환하면 물음표가 생깁니다.
이이 내 테스트 문자열 :
String doena = "DJ Doena";
String umlaut = "äöüßéèâ";
String allIn = "< ä ß á â & 木 >";
내가 처음에 문자열을 변환하는 방법이 있습니다 : 문자열 비교를 디버깅하는 것은 모두가 실제로 동일 함을 주장하면서
using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
{
sw.Write(decoded);
sw.Flush();
ms.Seek(0, SeekOrigin.Begin);
using (StreamReader sr = new StreamReader(ms, Encoding.GetEncoding(1252)))
{
encoded = sr.ReadToEnd();
}
}
}
문제가있다, 따라서 간단한 ==
또는 .Equals()
으로 충분하지 않습니다.
내가 base64로 필요하면 찾아 시도를 생산하는 방법이 있습니다 :
이private static String GetBase64Alternate(String utf8Text, String windows1252Text)
{
Byte[] utf8Bytes;
Byte[] windows1252Bytes;
String base64;
utf8Bytes = Encoding.UTF8.GetBytes(utf8Text);
windows1252Bytes = Encoding.GetEncoding(1252).GetBytes(windows1252Text);
base64 = null;
if (utf8Bytes.Length != windows1252Bytes.Length)
{
base64 = Convert.ToBase64String(utf8Bytes);
}
else
{
for(Int32 i = 0; i < utf8Bytes.Length; i++)
{
if(utf8Bytes[i] != windows1252Bytes[i])
{
base64 = Convert.ToBase64String(utf8Bytes);
break;
}
}
}
return (base64);
}
첫 번째 문자열 doena
완전히 동일하며 base64로 결과
Console.WriteLine(String.Format("{0}/{1}", windows1252Text, base64Text));
결과를 생성하지 않습니다 in
DJ Doena/
그러나 두 번째 문자열 umlauts
a lready 1252보다 UTF-8에서 두 번 바이트를 가지고 있으며, 따라서 필요하다고 표시되지 않습니다에도 불구하고 Base64로 문자열을 생성합니다
äöüßéèâ/w6TDtsO8w5/DqcOow6I=
을 그리고 세번째는이 "(더 이상하지 않는다하기로되어 있잖아 木? "하지만" "따라서 64 기수) 필요 :
< ä ß á â & ? >/PCDDpCDDnyDDoSDDoiAmIOacqCA+
더 나은 결과에 대한 성능 B에 대한 내 Base64로 게터가 강화 될 수있는 방법을 모든 단서를))?
미리 감사드립니다. :-)
보조 노트로 : 윈도우 1252으로 인코딩하기 전에 FormC에 정상화 고려한다. – CodesInChaos