我正在尝试获取和解析一个用希伯来语编写的在线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时,字符串保持不变...
我可能在这里做错了,有人知道如何正确转换上述内容吗?
谢谢,
米奇
答案 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个字符转换为'?'。