5

C# の Encoding API を使ってファイルを utf-8 から Arabia-1265 エンコーディングに変換しようとしたところ、次のステートメントの「ﻣﺣﻣد ﺻﻼ حعادل " "ﻣﺣﻣد ﺻ? ح عادل" と表示されます。私の友人の何人かは、これはこれらの文字がアラビア語プレゼンテーション フォーム B からのものであると私に言いました。私は notepad++ を使用してファイルを作成し、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# でこのプレゼンテーション フォームを使用してファイルを正しく変換する方法がわかりません。

4

3 に答える 3

5

はい、文字列には 1256 コード ページでは表現できない多くの合字が含まれています。書き込む前に文字列を分解する必要があります。このような:

  str = str.Normalize(NormalizationForm.FormKD);
  st.Write(str);
于 2010-09-21T08:58:04.553 に答える
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」)。これらは、アラビア語のテキストを表すために使用することを意図したものではありません。これらは主に互換性を目的としています。特に、すべての文字の異なる連結形式と連結文字の組み合わせごとに個別のコード ポイントを必要とするフォント ファイル形式との互換性を目的としています。「لا」合字は、2 文字であるにもかかわらず、1 つのコードポイント (U+FEFB) で表されます。

  • Windows-1256 にエンコードする場合 Windows-1256 の .NET エンコードは、プレゼンテーション フォーム ブロックの文字を自動的に「通常のテキスト」に変換します。明らかな理由から、実際に「同等」を持つ文字でのみそれを行うことができます。

  • Windows-1256からデコードする場合、 Windows-1256 の .NET エンコーディングは常に「通常のテキスト」ブロックから文字を生成します。

発見したとおり、入力ファイルには Windows-1256 で表現できない文字が含まれています。そのような文字は疑問符 ( ?) に変わります。さらに、通常のテキストに相当するプレゼンテーション形式の文字は、通常のアラビア語テキストが行うことであるため、結紮の動作を変更します

于 2010-09-21T08:48:23.790 に答える
0

まず第一に、あなたが引用した 2 つの文字は、Arabic Presentation Forms ブロックからのものではありません。これらは\x0644\x0627で、標準のアラビア語ブロックからのものです。ただし、念のため、Presentation Forms ブロックの لا の「同等の」(同等ではありませんが、ご存じのとおり) 文字である文字 を試してみました、それでも問題なく動作します\xFEFB

次に、従来の 8 ビット アラビア語テキスト用のエンコーディングWindows-1256を意味していると仮定します。

だから私は次のことを試しました:

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 エンコーディングは正常に機能しており、問題が何であるかは明確ではありません。

私の推奨事項:

  • 問題を示す短いコードを記述します。

  • そのコードで新しい質問を投稿してください。

  • その質問では、得られた結果と、代わりに期待した結果を正確に説明してください。

于 2010-09-21T07:52:12.273 に答える