我试图 将文件从UTF-8转换为Arabic-1265 使用C#中的编码API编码,但是我遇到了一个奇怪的问题,即某些字符未正确转换,例如以下语句中的“ adle” ﻣﺣﻣ ﻣﺣﻣ ﺻﻼ ﺻﻼعععع喝酒。我的一些朋友告诉我,这是因为这些字符来自阿拉伯语表格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#中的此演示文稿正确转换文件。

有帮助吗?

解决方案

是的,您的字符串包含许多在1256代码页面中无法表示的连接。在编写字符串之前,您必须分解该字符串。像这样:

  str = str.Normalize(NormalizationForm.FormKD);
  st.Write(str);

其他提示

给出更一般的答案:

  • Windows-1256编码是 过时的8位字符编码. 。它只有256个字符,其中只有60个是阿拉伯字母。

  • Unicode的字符范围更大。特别是它包含:

    • “正常”阿拉伯字符,u+0600至u+06ff。这些应该用于普通的阿拉伯文本,包括用其他使用阿拉伯语脚本的语言编写的文本,例如Farsi。例如,“。”是u+0644(。),其次是u+0627(ا)。

    • “演示形式”字符,u+fb50 to u+fdff(“呈现forms-a”)和u+fe70 to u+feff(“呈现forms-b”)。 这些不打算用于表示阿拉伯文本。 它们主要用于兼容性,尤其是使用字体文件格式,这些格式需要为每个字符和连接的字符组合的每个不同连接形式的代码点提供单独的代码点。尽管是两个字符,但“。”结扎的连接以单个编码点(U+FEFB)为代表。

  • 编码时 进入 Windows-1256,Windows-1256的.NET编码将自动将字符从演示文稿表单块转换为“正常文本” 因为它别无选择 (当然,除了将其全部变成问号)。出于明显的原因,它只能使用实际上具有“等效”的字符来做到这一点。

  • 解码时 Windows-1256,Windows-1256的.NET编码将始终从“正常文本”块中生成字符。

正如我们发现的那样,您的输入文件包含 在Windows-126中不可用. 。这样的角色会变成问号(?)。此外,那些演示形式的字符 具有正常的文本等效物,将改变其连接行为,因为这是普通阿拉伯文本所做的。

首先,您引用的两个字符是 不是 从阿拉伯语演示形式形成块。他们是 \x0644\x0627, ,来自标准阿拉伯块。但是,只是为了确保我尝试了角色 \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);

公平地说,控制台无法正确显示结果 - 但是调试器中的手表窗口告诉我答案是正确的(它说“。”)。我还可以从控制台复制输出,并且在剪贴板中是正确的。

因此,Windows-1256编码工作正常,尚不清楚您的问题是什么。

我的建议:

  • 编写一个简短的代码,以显示问题。

  • 发表一个新的问题,并使用该代码。

  • 在这个问题中,准确描述您获得的结果以及您预期的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top