より高いビットのASCII文字(ASCII 154に拡張されたÜなど)をU(ASCII 85)に変換するための疑似コードまたはサンプルコードを探しています。
私の最初の推測では、7 ビットの ASCII 文字に似た ASCII 文字は約 25 文字しかないため、変換配列を使用する必要があるでしょう。
他に考えられることがあれば教えてください。
より高いビットのASCII文字(ASCII 154に拡張されたÜなど)をU(ASCII 85)に変換するための疑似コードまたはサンプルコードを探しています。
私の最初の推測では、7 ビットの ASCII 文字に似た ASCII 文字は約 25 文字しかないため、変換配列を使用する必要があるでしょう。
他に考えられることがあれば教えてください。
.NET ユーザーの場合、CodeProject の記事( GvS のヒントのおかげ) は、これまでに見たどの記事よりも正確に質問に答えています。
ただし、その記事 (ソリューション #1) のコードは扱いにくいです。コンパクトバージョンは次のとおりです。
// Based on http://www.codeproject.com/Articles/13503/Stripping-Accents-from-Latin-Characters-A-Foray-in
private static string LatinToAscii(string inString)
{
var newStringBuilder = new StringBuilder();
newStringBuilder.Append(inString.Normalize(NormalizationForm.FormKD)
.Where(x => x < 128)
.ToArray());
return newStringBuilder.ToString();
}
答えを少し拡張するために、このメソッドはString.Normalizeを使用します。
テキスト値がこの文字列と同じであるが、バイナリ表現が指定された Unicode 正規化形式である新しい文字列を返します。
具体的には、この場合、同じ MSDN ドキュメントで次のように説明されているNormalizationFormを使用します。 FormKD
FormKD - Unicode 文字列が完全な互換性分解を使用して正規化されていることを示します。
Unicode 正規化形式の詳細については、Unicode Annex #15を参照してください。
ほとんどの言語には、アクセント付きの文字を標準の ASCII に置き換える標準的な方法がありますが、言語によって異なり、多くの場合、1 つのアクセント付きの文字を 2 つの ASCII 文字に置き換える必要があります。例えば、ドイツ語の ü は ue になります。したがって、自然言語を適切に処理しようとすると、思ったよりもはるかに複雑になります。
Ü を U に変換したいのですか? 他の言語については知りませんが、ドイツ語では Ü は Ue になり、ö は oe になります。
私はあなたができないと思います。
私は通常、次のようなことをします:
AccentString = 'ÀÂÄÉÈÊ[その他すべて]'
ConvertString = 'AAAEEE[その他すべて]'
AccentString で char を探し、ConvertString の同じインデックスに置き換えます
HTH
コード ページ 1251 では、文字は 2 バイトでコード化されます。1 つは基本文字用で、もう 1 つはバリエーション用です。次に、ASCII でエンコードし直すと、基本的な文字のみが保持されます。
public string RemoveDiacritics(string text)
{
return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text));
}
から: http://www.clt-services.com/blog/post/Enlever-les-accents-dans-une-chaine-(proprement).aspx
実際、 unexist によって提案されているように、「iconv」関数はすべての奇妙な変換を処理するために存在し、ほぼすべてのプログラミング言語で利用でき、ターゲットセットにない文字を近似値で変換しようとする特別なオプションがあります。
入力 UTF-8 文字列を 7 ビット ASCII に単純に変換するには、iconv を使用します。
そうしないと、常にコーナーケースにヒットして終了します。異なる文字セットを持つ異なるコードページを使用する8ビット入力(したがって、変換テーブルではまったく機能しません)、最後の愚かなアクセント付き文字を1つマッピングするのを忘れました(すべてのgrave /をマッピングしました急性アクセントですが、チェコ語のカロンまたは北欧の '°' をマッピングするのを忘れていました) など。
もちろん、解決策を小さな特定の問題 (音楽コレクションにファイル システムに適したファイル名を作成する) に適用したい場合は、ルックアップ配列が適しています (128 を超える各コード番号に対して、 JeeBee によって提案された 128 未満の近似、または vIceBerg によって提案されたソース/ターゲットのペア (選択した言語で既に使用可能な置換関数に応じて異なります)。
良さそうなCodeProjectに関する記事があります。
また、コードページ 1251 を使用した変換にも興味があります (他の回答を参照)。
私は変換テーブルが好きではありません.Unicode の文字数は非常に多く、簡単に見落としてしまうからです.
あなたはそれを釘付けにしたようです。char&127 でインデックス付けされた 128 バイト長のバイト配列で、8 ビット ビット文字に対応する 7 ビット文字が含まれています。
うーん、文字列のエンコーディングを iconv で変更してみませんか?
上位 128 文字には、標準的な意味はありません。これらは、ユーザーの言語に応じて異なる解釈 (コード ページ) を取ることができます。
たとえば、 ポルトガル語 と フランス系カナダ人を参照してください。
コードページを知らないと、「翻訳」が間違っていることがあります。
特定のコード ページ (元の IBM コード ページなど) を想定する場合は、変換配列が機能しますが、真の国際ユーザーにとっては、多くのことが間違っています。
これが、コード ページの古いシステムよりもユニコードが好まれる理由の 1 つです。
厳密に言えば、ASCII はわずか 7 ビットです。
ソース文字列の性質に大きく依存します。文字列のエンコーディングが分かっていて、それが 8 ビット エンコーディング (ISO Latin 1 など) であることがわかっている場合は、単純な静的配列で十分です。
static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... }
...
new_c = xlate[old_c];
一方、別のエンコーディングを使用している場合、または UTF-8 でエンコードされた文字列を使用している場合は、おそらくICUライブラリの関数が非常に役立つことに気付くでしょう。
ルックアップ配列は、おそらくこれを実現するための最も簡単で最速の方法です。これは、たとえば ASCII を EBCDIC に変換できる 1 つの方法です。
この関数を使用して、変数をアクセント付きで修正し、VB6 から soap 関数に渡します。
Function FixAccents(ByVal Valor As String) As String
Dim x As Long
Valor = Replace(Valor, Chr$(38), "&#" & 38 & ";")
For x = 127 To 255
Valor = Replace(Valor, Chr$(x), "&#" & x & ";")
Next
FixAccents = Valor
End Function
そして、soap 関数内でこれを行います (変数 Filename に対して):
FileName = HttpContext.Current.Server.HtmlDecode(FileName)
あなたはすでにそれを頭に釘付けにしたと思います。ドメインが限られている場合、変換配列またはハッシュが最善の策です。複雑なものを作成して自動的に実行しようとするのは意味がありません。
uni2asciiプログラムを試してください。