如何在C# WinForm中正确显示可读阿拉伯字符串?
如何在C#中还原Windows-1256编码的阿拉伯字符串
我来帮你解决这个问题——你遇到的本质是编码的逆向转换问题,咱们一步步理清楚:
问题根源
你在Notepad里的操作逻辑是:把被错误编码解析的乱码字符串("ÌÜÜæØÜÜÇÈá ÊíÌÜÜí 2"),重新用正确的编码(Windows 1256)读取,从而得到正确的阿拉伯语。这里的关键是:这个乱码是原本Windows 1256编码的字节,被你的系统默认ANSI编码(Notepad里的ANSI选项对应系统当前代码页,通常是Windows 1252)错误解析后生成的。
你之前代码无效的原因
你错误地选择了windows-1250(中欧语言编码)作为源编码,但实际生成乱码的是系统默认的ANSI编码(比如Windows 1252),源编码不匹配,自然转换不出正确结果。
正确的C#实现代码
// 1. 获取生成乱码的源编码:即Notepad++里的ANSI,对应系统默认编码 Encoding sourceEncoding = Encoding.Default; // 如果你能确定系统ANSI是Windows 1252,也可以直接写:Encoding.GetEncoding(1252); // 2. 获取目标编码:阿拉伯语专用的Windows 1256 Encoding targetEncoding = Encoding.GetEncoding("Windows-1256"); // 3. 把乱码字符串转回源编码对应的字节数组 byte[] sourceBytes = sourceEncoding.GetBytes("ÌÜÜæØÜÜÇÈá ÊíÌÜÜí 2"); // 4. 用目标编码解码字节数组,得到正确的阿拉伯字符串 string correctArabicText = targetEncoding.GetString(sourceBytes); // 输出结果:جــوطــابل تيجــي 2 Console.WriteLine(correctArabicText);
补充说明
- 如果你的系统默认ANSI不是Windows 1252,可以先在Notepad++里查看ANSI对应的具体代码页(比如通过「编码→字符编码」的子菜单),然后用
Encoding.GetEncoding(代码页编号)来指定源编码(比如Windows 1252对应编号1252,Windows 1256对应编号1256)。 - 这段代码的逻辑和你在Notepad++里的操作完全一致:先把乱码还原成原始字节,再用正确的编码解析字节。
内容的提问来源于stack exchange,提问作者Mohamed SAIM
相关产品推荐
相关产品推荐

