C#Encoding.Converting Latin to Hebrew

时间:2011-08-29 22:05:27

标签: c# .net encoding hebrew

我正在尝试获取和解析一个用希伯来语编写的在线excel文档,但不幸的是用非希伯来语编码。

作为一个例子,我正在尝试转换以下字符串:“âìéåï_1”,它使用C#代码作为希伯来语的第一个工作表名称,但我无法这样做。

我知道上面的内容是可转换的,因为当我在NotePad ++中打开并选择编码/字符集/希伯来语/ 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时,字符串保持不变...

我可能在这里做错了,有人知道如何正确转换上述内容吗?

谢谢,

米奇

1 个答案:

答案 0 :(得分:16)

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个字符转换为'?'。