C#编码:将拉丁文转换为希伯来文

7
我正在尝试获取和解析一个在线的Excel文档,该文档使用希伯来语编写,但遗憾的是使用了非希伯来语编码。

例如,我正在尝试使用C#代码将以下字符串转换为希伯来语,该字符串作为第1个工作表名称:"âìéåï_1",但我无法做到。

我知道上述内容可以转换,因为当我在NotePad++中打开它并选择Encoding/Character Sets/Hebrew/Windows 1255时,我可以看到:"גליון_1",这是上述字符串的正确希伯来语表示。

我正在使用以下代码:

            string str = "âìéåï_1";

            Encoding windows = Encoding.GetEncoding("Windows-1255");
            Encoding ascii = Encoding.GetEncoding("Windows-1252");
            byte[] asciiBytes = ascii.GetBytes(str);
            byte[] windowsBytes = Encoding.Convert(ascii, windows, asciiBytes);

            char[] windowsChars = new char[windows.GetCharCount(windowsBytes, 0, windowsBytes.Length)];
            windows.GetChars(windowsBytes, 0, windowsBytes.Length, windowsChars, 0);
            string windowsString = new string(windowsChars);

我认为原始字符串的编码是 Windows-1252,因为当我将其粘贴到 NotePad++ 中并将编码更改为 Windows-1252 时,该字符串保持不变...

我可能在做错什么,有人知道如何正确转换吗?

谢谢,

Mikey

1个回答

19
const string Str = "âìéåï_1";

Encoding latinEncoding = Encoding.GetEncoding("Windows-1252");
Encoding hebrewEncoding = Encoding.GetEncoding("Windows-1255");

byte[] latinBytes = latinEncoding.GetBytes(Str);

string hebrewString = hebrewEncoding.GetString(latinBytes);

hebrewString:

גליון_1

在你提供的例子中,"Window-1252"不是真正的ASCII,它是扩展ASCII码。由于某种原因,使用这两种编码的Encoding.Convert无法转换扩展范围的ASCII码,所以所有大于127的字符都会被转换为63(即“?”)。当将一个扩展ASCII字符的byte[]转换为另一个时,我会期望这些字节是相同的,只有在将它们转换为.NET Unicode字符串时才会不同。不确定为什么Convert将+127字符转换为“?”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接