Я погуглил по этой теме и просмотрел все ответы, но до сих пор не понимаю.
В основном мне нужно преобразовать строку UTF-8 в ISO-8859-1, и я делаю это, используя следующий код:
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));
Моя исходная строка
Message = "ÄäÖöÕõÜü"
Но, к сожалению, моя строка результата становится
msg = "�ä�ö�õ�ü
Что я здесь делаю не так?
Encoding.Unicode
в Win32 API. Юникод - это набор символов, а не кодировка. UTF-16 - одна из нескольких кодировок для Unicode.)Message
было декодировано из UTF-8. Предполагая, что эта часть работает правильно, преобразование в Latin-1 так же просто, какbyte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Message)
. Затем, как говорит StuS, вы можете преобразовать байты Latin-1 обратно в UTF-16 с помощьюEncoding.GetEncoding("ISO-8859-1").GetString(bytes)
Ответы:
Используйте Encoding.Convert, чтобы настроить массив байтов, прежде чем пытаться декодировать его в целевую кодировку.
источник
Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(myString)))
Я думаю, ваша проблема в том, что вы предполагаете, что байты, представляющие строку utf8, приведут к той же строке при интерпретации как что-то еще (iso-8859-1). А это просто не так. Я рекомендую вам прочитать эту отличную статью Джоэла Спольски.
источник
Попробуй это:
источник
В первую очередь вам нужно исправить источник строки.
Строка в .NET на самом деле представляет собой просто массив 16-битных кодовых точек Юникода, символов, поэтому строка не находится в какой-либо конкретной кодировке.
Когда вы берете эту строку и преобразуете ее в набор байтов, в игру вступает кодирование.
В любом случае, как вы это сделали, закодировав строку в массив байтов с одним набором символов, а затем декодировав ее другим, как видите, не сработает.
Не могли бы вы рассказать нам подробнее, откуда взялась эта исходная строка и почему, по вашему мнению, она была неправильно закодирована?
источник
Кажется немного странным код. Чтобы получить строку из потока байтов Utf8, все, что вам нужно сделать, это:
Если вам нужно где-то сохранить поток байтов iso-8859-1, просто используйте: дополнительную строку кода для предыдущего:
источник
Просто использовал раствор Натана, и он отлично работает. Мне нужно было преобразовать ISO-8859-1 в Unicode:
источник
источник
Вот образец для ISO-8859-9;
источник