2011-08-29 143 views
3

我试图获取和解析在希伯来语中编写的在线excel文档,但不幸的是在非希伯来语编码中。C#Encoding.Converting拉丁语到希伯来语

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

我知道上面是可转换的,因为当我在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,因为当我把它粘贴在记事本++和更改编码到Windows 1252的串仍然是相同...

我可能在这里做错了什么,任何人都知道如何正确地转换上述内容?

感谢,

米奇

回答

12
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

在你提供的示例 “窗口 - 1252” 不是actualy ASCII,它被延长ASCII,并由于某种原因Encoding.Convert与如果两个编码不能转换扩展范围的ASCII,则所有+127个字符都转换为63(即, ?)。当从一个扩展的ASCII字符byte []转换为另一个时,我期望字节是相同的,只有当你将它们转换为一个.Net unicode字符串时,我预计它们会不同。不知道为什么Convert正在将+127个字符转换为'?'。

+1

很好地完成!非常感谢! –