моей целью является преобразование строки .NET (Unicode) в Windows-1252 и - при необходимости - сохранение исходной строки UTF-8 в объекте Base64.Сравнение строки Windows-1252 с строкой UTF-8
Например, строка «DJ Doena», преобразованная в 1252, по-прежнему «DJ Doena».
Однако, если вы конвертируете японский kanjii для дерева (木) в 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));
результаты в
DJ Doena/
Но вторая строка umlauts
a lready имеет в два раза больше байт в кодировке UTF-8, чем в 1252 году, и, таким образом, создает строку Base64, даже если это не представляется необходимым:
äöüßéèâ/w6TDtsO8w5/DqcOow6I=
И третий один делает то, что он должен не делать (не более «木? ", а„“, таким образом, base64 требуется):
< ä ß á â & ? >/PCDDpCDDnyDDoSDDoiAmIOacqCA+
Любые подсказки, как мой Base64 геттер может быть повышена а) для исполнения б) для достижения лучших результатов?
Заранее спасибо. :-)
В качестве примечания: Рассмотрим нормализацию в FormC перед кодированием, как Windows-1252. – CodesInChaos