c # проблема с кодировкой? - PullRequest
       4

c # проблема с кодировкой?

0 голосов
/ 03 ноября 2011

У меня есть ввод, например: DisplaygröÃe

И я хочу вывод, например: Displaygröÿe

С Notepad ++ проблема была решена путем: преобразования в ANSI, кодирования в UTF8 и преобразования обратно в ANSI.

Мне нужно сделать это программно в c #.

Я пытался конвертировать в / из ansi, utf8, latin-1 и ни один не работает должным образом, это показывает?с функцией, которая использует Encoding.Default.GetBytes, затем
res = Enconding.Convert (src1, dest1, bytes) и
EncodingDest.GetChars (res);
где EncodingDest представляет выходную кодировку ..

Код работает в консольном приложении, но тот же результат в WPF.Неважно, что кодировка хороша для вывода, только если она работает, эти проблемы также для страны, как Испания, Италия или Швеция.

Ответы [ 5 ]

2 голосов
/ 03 ноября 2011

использовать System.Text.Encoding

var ascii = Encoding.ASCII.GetBytes("DisplaygröÃe");
var utf8 = Encoding.Convert(Encoding.ASCII, Encoding.UTF8, ascii);
var output = Encoding.UTF8.GetString(utf8);
1 голос
/ 04 ноября 2011

@ DanM: Вам нужно , чтобы узнать, в каком наборе символов введен ваш ввод.

«DisplaygröÃe» - это то, что вы увидите, если вы возьмете строку «Displaygröße» (предложено Владом), закодируете ее в байты как UTF-8, а затем неправильно декодируете ее как latin1.

Если вы сделаете то же самое с Displaygröÿe, вы увидите «Displaygröe» (буквально там есть перевернутый знак вопроса, это не заполнитель для чего-то, что не может быть отображено.) Технически, «Displaygrö У "вероятно" есть другой символ между à и e, но это контрольный код, и поэтому он невидим для вас.

Если у вас есть набор символов foo, это верно: my_string = foo_decode(foo_encode(my_string)). Если у вас есть другая строка набора символов, это верно: barf = bar_decode(foo_encode(my_string)) где barf - это мусор, который вы видите.

Если вы не знаете, в каком наборе символов находится ваш ввод, вы только правильно его расшифруете.

Похоже, что ваши входные файлы находятся в формате UTF-8, и вам нужно будет декодировать байты из файла как таковые. (Я не говорю достаточно C #, чтобы помочь вам здесь ... Я говорю только кодировки символов.)

1 голос
/ 03 ноября 2011

Когда вы выводите строку где-то (например, TextWriter, или Stream, или byte[]), вы всегда должны указывать кодировку, если только вы не хотите вывод UTF-8 (по умолчанию):

using(StreamWriter sw = new StreamWriter("file.txt", Encoding.GetEncoding("windows-1252"))
    sw.WriteLine("Displaygröÿe");
0 голосов
/ 03 ноября 2011

у нас была похожая проблема при отправке данных на текстовый принтер, и я работаю только с одним (записано как расширение):

    public static byte[] ToAnsiMemBytes(this string input)
    {
        int length = input.Length;
        byte[] result = new byte[length];

        try
        {
            IntPtr bytes = Marshal.StringToCoTaskMemAnsi(input);
            Marshal.Copy(bytes, result, 0, length);
        }
        catch (Exception)
        {
            result = null;
        }

        return result;
    }
0 голосов
/ 03 ноября 2011
using (var rdr = new StreamReader(fs, Encoding.GetEncoding(1252))) {
     result = rdr.ReadToEnd();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...