Как прочитать символ Unicode "знак степени" из кодированного текстового файла UTF-8 в C #? - PullRequest
1 голос
/ 03 июля 2019

Я записал текстовый файл, который содержит некоторые символы Юникода: например, «знак степени» \ u00b0 и «SUPERSCRIPT TWO» \ u00b2.

Затем я хочу прочитать этот текстовый файл с помощью c # StreamReader.Эти символы Юникода не могут быть прочитаны должным образом.

текстовый файл содержит строки следующим образом:

26, Ускорение данных транспортного средства Z, м / с², System.Single 27, Угловая скорость VehicleData около X, ° /s, System.Single

Секция чтения данных:

1. StreamReader indexReader = File.OpenText( filename + ".txt");
2. StreamReader indexReader = new StreamReader(filename + ".txt", System.Text.Encoding.Unicode);

...

Секция назначения данных:

for ( int i = 0; i < headerCount; i++ )
{
  string line = indexReader.ReadLine();
  string[] parameterHeader = line.Split( ',' );
  var next = new ReportParameters.ParameterInfoElement();
  next.parameterID = Int32.Parse( parameterHeader[ 0 ] );
  next.name = parameterHeader[ 1 ];
  next.units = parameterHeader[ 2 ];
  next.type = Type.GetType( parameterHeader[ 3 ] );

  _header.Add( next );
}

м / с² и° / s будет читаться как m / s� и � / s.

Я хочу прочитать это правильно.

1 Ответ

1 голос
/ 03 июля 2019

Ключевым моментом здесь является передача правильного Encoding читателю;поскольку вы говорите, что это UTF-8:

/* write a dummy file as raw UTF-8; this is just test data that looks like:
1°
2²
3
*/
File.WriteAllBytes("test.txt", new byte[] {
         0x31, 0xC2, 0xB0, 0x0D, 0x0A,
         0x32, 0xC2, 0xB2, 0x0D, 0x0A, 0x33 });

// use the TextReader API to consume the file
using (var reader = new StreamReader("test.txt", Encoding.UTF8))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

Обратите внимание, что проще использовать foreach с File.ReadLines("test.txt", Encoding.UTF8):

foreach(var line in File.ReadLines("test.txt", Encoding.UTF8))
{
    Console.WriteLine(line);
}
...