我试图使用C#中的编码API将文件从utf-8转换为Arabic-1265 编码,但我遇到了一个奇怪的问题,即某些字符未正确转换,例如“لا “在下面的声明中”محمدصلاحعادل“它显示为”محمدص?حعادل“。我的一些朋友告诉我,这是因为这些字符来自阿拉伯语演示表B.我使用记事本++创建文件并将其保存为utf-8。
这是我使用的代码
StreamReader sr = new StreamReader(@"C:\utf-8.txt", Encoding.UTF8);
string str = sr.ReadLine();
StreamWriter sw = new StreamWriter(@"C:\windows-1256.txt", false, Encoding.GetEncoding("windows-1256"));
sw.Write(str);
sw.Flush();
sw.Close();
但是,我不知道如何使用C#中的演示文稿表格正确转换文件。
答案 0 :(得分:5)
是的,您的字符串包含许多无法在1256代码页中表示的连字。在编写之前你必须分解字符串。像这样:
str = str.Normalize(NormalizationForm.FormKD);
st.Write(str);
答案 1 :(得分:3)
提供更一般的答案:
Windows-1256编码是过时的8位字符编码。它只有256个字符,其中只有60个是阿拉伯字母。
Unicode具有更广泛的字符。特别是,它包含:
“普通”阿拉伯字符,U + 0600到U + 06FF。这些应该用于普通的阿拉伯语文本,包括用其他使用阿拉伯语脚本的语言编写的文本,例如波斯语。例如,“لا”是U + 0644(ل),后跟U + 0627(ا)。
“演示表格”字符,U + FB50至U + FDFF(“演示表格-A”)和U + FE70至U + FEFF(“演示表格-B”)。 这些不用于表示阿拉伯语文本。它们主要用于兼容性,特别是对于每个字符和连接字符组合的每个不同连接形式都需要单独代码点的字体文件格式。尽管是两个字符,“لا”连字由单个代码点(U + FEFB)表示。
将编码到 Windows-1256中时,Windows-1256的.NET编码会自动将Presentation Forms块中的字符转换为“普通文本”,因为它没有其他选择(当然除了把它全部变成问号)。出于显而易见的原因,它只能用实际上具有“等效”的字符来实现。
从 Windows-1256解码时,Windows-1256的.NET编码将始终从“普通文本”块生成字符。
正如我们所发现的,您的输入文件包含在Windows-1256 中无法表示的字符。这些字符将变成问号(?
)。此外,那些做具有正常文本等同物的表现形式字符将改变他们的结扎行为,因为这是正常的阿拉伯文本所做的。
答案 2 :(得分:0)
首先,您引用的两个字符是来自阿拉伯语Presentation Forms块的不。它们是\x0644
和\x0627
,来自标准阿拉伯语块。但是,为了确保我在Presentation Forms块中尝试了字符\xFEFB
,其中 是“等效”(不等效,但你知道)لا的字符,它工作正常即便如此。
其次,我假设您的意思是编码 Windows-1256 ,这是用于传统的8位阿拉伯文字。
所以我尝试了以下内容:
var input = "لا";
var encoding = Encoding.GetEncoding("windows-1256");
var result = encoding.GetBytes(input);
Console.WriteLine(string.Join(", ", result));
我得到的输出是225, 199
。所以让我们试着把它转回来:
var bytes = new byte[] { 225, 199 };
var result2 = encoding.GetString(bytes);
Console.WriteLine(result2);
很好,控制台没有正确显示结果 - 但调试器中的Watch窗口告诉我答案是正确的(它说“لا”)。我也可以从控制台复制输出,它在剪贴板中是正确的。
因此,Windows-1256编码工作得很好,不清楚你的问题是什么。
我的建议:
编写一段显示问题的简短代码。
使用该段代码发布新问题。
在该问题中,准确描述您获得的结果,以及您期望的结果。