无法通过 C# 将 ANSI 编码重现为 Windows-1256
Can't reproduce ANSI Encoding to Windows-1256 by C#
我在 mdb 文件中有一些编码数据,例如 Úæäí 和 ÚáÇä;我尝试使用记事本 ++,首先使用 ANSI 编码创建新文件,然后将文本放入其中,最后将编码更改为 Windows-1256,结果是 ùوني ,علان 完美,但我无法重现这个场景编码(C#)。这是代码:
public string Decode(DataRow rw,string colName)
{
Encoding srcEnc = Encoding.GetEncoding("from what ?");
Encoding destEnc = Encoding.GetEncoding("1256");// arabic encoding
byte[] srcVal = rscEnc.GetBytes(rw[colName].ToString());
byte[] destVal = Encoding.Convert(srcEnc,destEnc,srcVal);
return destEnc.GetString(destVal);
}
问题是您在编码之间转换。这实际上并不是您要实现的目标,您只是想 重新解释 编码文本。
为此,您需要获取 ANSI 字符串的字节,然后使用正确的编码对其进行解码。
因此,忽略转换:
var latin = Encoding.GetEncoding(1252);
var bytes = latin.GetBytes("Úæäí");
var arabic = Encoding.GetEncoding(1256);
var result = arabic.GetString(bytes);
result
是 عوني
注意,正如 Hans 在评论中指出的那样:Windows-1252 has 5 byte values that are unused (0x81
, 0x8D
, 0x8F
, 0x90
, and 0x9D
). If these correspond to characters in Windows-1256 在原始文本中使用,那么您的源数据已损坏,因为这些字符在使用 1252 进行初始解码时会丢失。理想情况下,您想从原始编码源开始。
我在 mdb 文件中有一些编码数据,例如 Úæäí 和 ÚáÇä;我尝试使用记事本 ++,首先使用 ANSI 编码创建新文件,然后将文本放入其中,最后将编码更改为 Windows-1256,结果是 ùوني ,علان 完美,但我无法重现这个场景编码(C#)。这是代码:
public string Decode(DataRow rw,string colName)
{
Encoding srcEnc = Encoding.GetEncoding("from what ?");
Encoding destEnc = Encoding.GetEncoding("1256");// arabic encoding
byte[] srcVal = rscEnc.GetBytes(rw[colName].ToString());
byte[] destVal = Encoding.Convert(srcEnc,destEnc,srcVal);
return destEnc.GetString(destVal);
}
问题是您在编码之间转换。这实际上并不是您要实现的目标,您只是想 重新解释 编码文本。
为此,您需要获取 ANSI 字符串的字节,然后使用正确的编码对其进行解码。
因此,忽略转换:
var latin = Encoding.GetEncoding(1252);
var bytes = latin.GetBytes("Úæäí");
var arabic = Encoding.GetEncoding(1256);
var result = arabic.GetString(bytes);
result
是 عوني
注意,正如 Hans 在评论中指出的那样:Windows-1252 has 5 byte values that are unused (0x81
, 0x8D
, 0x8F
, 0x90
, and 0x9D
). If these correspond to characters in Windows-1256 在原始文本中使用,那么您的源数据已损坏,因为这些字符在使用 1252 进行初始解码时会丢失。理想情况下,您想从原始编码源开始。