2

私が必要としているのは、ASCII 文字ごとに、同等の Unicode 文字のリストのようなものです。

問題は、Microsoft Excel や Word などのプログラムが、ドキュメントに入力するときに非 ASCII の二重引用符、単一引用符、ダッシュなどを挿入することです。このテキストを、半角文字を必要とする「varchar」型のデータベース フィールドに格納したいと考えています。

ASCII (シングルバイト) テキストを格納するために、これらの Unicode 文字の一部は、特定の ASCII 文字と同等または類似していると見なされる可能性があるため、Unicode 文字を同等の ASCII 文字に置き換えても問題ありません。

Unicode テキストを同等の ASCII 文字に変換する MapToASCII のような単純な関数が必要です。これにより、ASCII 文字に似ていない Unicode 文字の置換文字を指定できます。

4

2 に答える 2

1

Win32 API WideCharToMultiByteをこの変換 (Unicode から ANSI へ) に使用できます。CP_ACP を最初のパラメーターとして使用します。独自のマッピング関数を構築しようとするよりも、そのような方がよいでしょう。

編集OPの希望に反する解決策としてこれを宣伝しようとしているように聞こえるかもしれませんが、このAPIが求めていることの多く(すべて?)を行うことを指摘する価値があるようです. 目標は、Unicode文字列を可能な限り「ANSI」にマップすることです(私はそう思います)(この場合、ANSIは動くターゲットのようなものかもしれません)。追加の要件は、マップできない文字の代替文字を指定できることです。次の例はこれを行います。Unicode 文字列を "変換" し、変換charできない文字にはアンダースコア (最後から 2 番目のパラメーター) を使用します。

ret = WideCharToMultiByte( CP_ACP, 0, L"abc個חあЖdef", -1, 
                           ac, sizeof( ac ), "_", NULL );
for ( i = 0; i < strlen( ac ); i++ )
  printf( "%c %02x\n", ac[i], ac[i] );
于 2011-04-13T14:50:35.053 に答える
0

関連性の高い質問は次のとおりです: Unicode punctuation を ASCII 近似で置き換える

そこの答えは不十分ですが、私にアイ​​デアを与えてくれました。Basic Multilingual Plane (0) の各 Unicode コード ポイントを、対応する ASCII 文字 (存在する場合) にマップできます。次の C# コードは、各値の置換文字を入力できる HTML フォームを作成するのに役立ちます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.IO;

namespace UnicodeCharacterCategorizer
{
    class Program
    {
        static void Main(string[] args)
        {
            string output_filename = "output.htm"; //set a filename if not specifying one through the command line
            Dictionary<UnicodeCategory,List<char>> category_character_sets = new Dictionary<UnicodeCategory,List<char>>();
            foreach (UnicodeCategory c in Enum.GetValues(typeof(UnicodeCategory)))
                category_character_sets.Add( c, new List<char>() );
            for (int i = 0; i <= 0xFFFF; i++)
            {
                if (i >= 0xD800 && i <= 0xDFFF) continue; //Skip ranges reserved for high/low surrogate pairs.
                char c = (char)i;
                UnicodeCategory category = char.GetUnicodeCategory( c );
                category_character_sets[category].Add( c );
            }
            StringBuilder file_data = new StringBuilder( @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""><html xmlns=""http://www.w3.org/1999/xhtml""><head><title>Unicode Category Character Sets</title><style>.categoryblock{border:3px solid black;margin-bottom:10px;padding:5px;} .characterblock{display:inline-block;border:1px solid grey;padding:5px;margin-right:5px;} .character{display:inline-block;font-weight:bold;background-color:#ffeeee} .numericvalue{color:blue;}</style></head><body><form id=""charactermap"">" );
            foreach (KeyValuePair<UnicodeCategory,List<char>> entry in category_character_sets)
            {
                file_data.Append( @"<div class=""categoryblock""><h1>" + entry.Key.ToString() + ":</h1><br />" );
                foreach (char c in entry.Value)
                {
                    string hex_value = ((int)c).ToString( "x" );
                    file_data.Append( @"<div class=""characterblock""><span class=""character"">&#x" + hex_value + @";<br /><span class=""numericvalue"">" + hex_value + @"</span><br /><input type=""text"" name=""r_" + hex_value + @""" /></div>" );
                }
                file_data.Append( "</div>" );
            }
            file_data.Append("</form></body></html>" );
            File.WriteAllText( output_filename, file_data.ToString(), Encoding.Unicode );
        }
    }
}

具体的には、このコードは、BMP 内のすべての文字を含む HTML フォームを、"r_" (r は "置換値" を表す) で始まる 16 進数値にちなんで名付けられた入力テキスト ボックスと共に生成します。これが ASP.NET ページに移植された場合、追加のコードを記述して、置換値を可能な限り事前設定することができます。

  • すでにASCIIの場合は独自の値で、または
  • Unicode で正規化された FormD または FormKD で分解された等価物、または
  • カテゴリ全体の単一の ASCII 値 (つまり、すべての「句読点の頭文字」を ASCII 二重引用符で囲んだもの)

その後、手動で調整を行うことができますが、思ったほど長くはかからないでしょう。コードポイントは 64512 しかなく、カテゴリ全体の大きなチャンクは、おそらく「ASCII に近いものはない」として却下できます。そこで、このマップと関数を作成します。

于 2011-04-14T18:36:15.757 に答える