Символы Юникода, возвращающиеся из R.NET - PullRequest
0 голосов
/ 20 декабря 2018

Я возвращаю символьный вектор из функции в R на C #, используя R.NET.Единственная проблема заключается в том, что символы Unicode, такие как греческие буквы, теряются.В следующей строке приведен пример кода, который я использую:

CharacterVector cvAll = results[5].AsList().AsCharacter();

Где results - это список результатов, возвращаемых функцией R.Символы также записываются буквой R в текстовый файл, и они хорошо отображаются в блокноте и других редакторах.Могу ли я заставить R.Net правильно вернуть символы?

1 Ответ

0 голосов
/ 24 декабря 2018

Похоже, вы столкнулись с открытой проблемой с RDotNet: https://github.com/jmp75/rdotnet/issues/25

Символы Юникода, похоже, еще не поддерживаются.Я столкнулся с той же проблемой при вызове метода engine.CreateDataFrame ().Он вернул DataFrame со всеми моими неверно выделенными строками.

Хотя кажется, что есть обходной путь: при вызове функций RDotNet, если я даю строки, закодированные в кодировке по умолчанию на моем компьютере (Windows ANSI) и преобразованные изUTF-8 (важно), R берет их и возвращает правильно интерпретированные акцентированные строки в C #.Я точно не знаю, почему это работает ... Возможно, это связано с кодировкой по умолчанию, используемой для .Net для string, которая является UTF-16.(см. здесь: http://csharpindepth.com/Articles/General/Strings.aspx),, следовательно, преобразование из UTF-8 в стандартную ANSI, которая, кажется, работает.

Вот ужасный пример: когда я собираю RDotNet DataFrame,Я преобразую все строки в кодировке CharacterVector в ANSI (из UTF-8):

try 
{
    string[] colAsStrings = null;
    colAsStrings = Array.ConvertAll<object, string>(uneColonne, s => StringEncodingHelper.EncodeToDefaultFromUTF8((string)s));
    correctedDataArray[i] = colAsStrings;
    columnConverted = true;
}

Вот статический метод, используемый для преобразования:

public static string EncodeToDefaultFromUTF8(string stringToEncode)
{
    byte[] utf8EncodedBytes = Encoding.UTF8.GetBytes(stringToEncode);

    return Encoding.Default.GetString(utf8EncodedBytes);
}
...