質問
私ための擬似コード、またはサンプルコード変換する高ビットascii文字(いÜる拡張ascii154)へのU(ascii85).
私の初期推定することがで約25ascii文字と同じような位7ビットascii文字の翻訳を配列において使用します。
私の場合のようなものと考えることができています。
解決
unexistが提案したとおり: " iconv"関数は、すべての奇妙な変換を処理するために存在し、ほとんどすべてのプログラミング言語で使用でき、ターゲットセットにない文字を近似で変換しようとする特別なオプションがあります。
iconvを使用して、入力UTF-8文字列を7ビットASCIIに単純に変換します。
それ以外の場合、あなたは常にコーナーケースを打つことを終了します:異なる文字セットの異なるコードページを使用する8ビット入力(したがって変換テーブルでまったく機能しません)、最後の愚かなアクセント文字をマッピングするのを忘れました(マッピングしました)すべての墓/急性アクセントが、チェコのキャロンまたは北欧の '°')などをマップするのを忘れていた
もちろん、特定の小さな問題に解決策を適用したい場合(音楽コレクションのファイルシステムに優しいファイル名を作成する場合)は、ルックアップ配列(上記の各コード番号に対応する配列) 128は、JeeBeeによって提案された128未満の近似値、または選択した言語で既に使用可能な置換関数に応じてvIceBergによって提案されたソース/ターゲットのペアをマップします)。 >
他のヒント
ます。インターネットを利用する側の 記事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 そのバイナリ表現は、指定されたUnicode 正規化形式です。
具体的にはこの場合に利用してい NormalizationForm FormKD
, 記載されていたのにも同じようにMSDN docsなど:
FormKD-このUnicode文字列を正規化した利用の完全互換性分解する。
詳unicode正規化形式は、 Unicode別館15号.
ほとんどの言語には、アクセント記号付き文字を標準ASCIIに置き換える標準的な方法がありますが、言語によって異なり、1つのアクセント記号付き文字を2つのASCII文字に置き換えることがよくあります。例えばドイツ語&#252; ueになります。したがって、自然言語を適切に処理したい場合、思っているよりもはるかに複雑になります。
変換中&#220;本当にあなたがしたいことは?私は他の言語については知りませんが、ドイツ語で&#220; Ueになります&#246; oeなどになります。
あなたにはできないと思う。
私は通常そのようなことをします:
AccentString = '&#192;&#194;&#196;&#201;&#200;&#202; [およびその他すべて]'
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
あなたはそれを釘付けにしたようだ。 char&amp; 127でインデックス付けされた、128ビット長のバイト配列。8ビットビット文字に一致する7ビット文字を含みます。
うーん、なぜiconvで文字列のエンコーディングを変更しないのですか?
ソース文字列の性質に本当に依存します。文字列のエンコードがわかっていて、8ビットエンコードであることを知っている場合&#8212;たとえば、ISO Latin 1または同様の&#8212;単純な静的配列で十分です:
static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... }
...
new_c = xlate[old_c];
一方、異なるエンコーディングを使用している場合、またはUTF-8でエンコードされた文字列を使用している場合、おそらく ICU ライブラリは非常に役立ちます。
CodeProject に見栄えの良い記事があります。
>コードページ1251を使用した変換にも興味があります(他の回答を参照)。
Unicodeの文字数が多すぎるため、簡単に見逃してしまうため、変換テーブルは好きではありません。
すでに頭に釘付けしていたと思います。限られたドメインを考えると、変換配列またはハッシュが最善の策です。複雑なものを自動的に作成しようとしても意味がありません。
これを実現するには、おそらくルックアップ配列が最も簡単で最速の方法です。これは、たとえばASCIIをEBCDICに変換する1つの方法です。
uni2ascii プログラムをお試しください。
この関数を使用して、アクセント付きの変数を修正し、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)