从R.NET返回的Unicode字符

时间:2018-12-20 14:47:44

标签: r.net

我正在使用R.NET将R中的字符向量返回到C#。唯一的问题是,Unicode字符(例如希腊字母)正在丢失。下面的行提供了我正在使用的代码的示例:

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

结果是R函数返回的结果的列表。字符也由R写入文本文件,并且在记事本和其他编辑器中可以正常显示。我可以让R.Net正确返回字符吗?

1 个答案:

答案 0 :(得分:0)

看起来您遇到了RDotNet的未解决问题:https://github.com/jmp75/rdotnet/issues/25

似乎尚不支持Unicode字符。我在调用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)编码的ANSI字符串:

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);
}