2011-03-11 4 views
0

私はUTF-8文字列をchar*として持っています。文字あたりの1バイトにつき1つのバイトをに取得するには、文字インデックスでランダムにアクセスできるようにするため、現在はすべてのUTF-8連続バイトを削除しています(静的に「適切な」変換を避けたいですバイト幅表現)。マルチバイトのUTF-8文字表現を1バイトに変換するにはどうすればいいですか?

の代わりに私が与えられたマルチバイトUTF-8文字は英数字(またはしない)であるかどうかを確認してから、対応するASCII文字に置き換えることができるようにしたいすべての連続バイトを削除する(のが英数字のためaをしましょうとそれ以外の場合は.)。これはどうすればいいですか?

+0

現在の文字列のアルファベットは何ですか?それはいくつかの日本や中国やアジアからのいくつかの他の文字を持つことができますか? – Zimbabao

+0

@Zimbabao:何でもかまいません(アルファベットはUnicode全体です)。 – hasseg

答えて

2

  • それはASCIIバイトである場合は、それをコピーします。
  • wchar_tを使用してUTF-8先頭バイトである場合は、mbrtowcを使用して、isw*()関数の結果を比較して分類が一致するASCII文字を判別し、そのASCII文字を出力にコピーします。
  • それ以外の場合は、スキップしてください。
2

一般的には、ASCII範囲外の文字(αなど)にもアクセント記号(ἄ)が付く可能性があるため、これを行う方法はありません。しかし、NFD Unicode normalizationを適用してアクセント付きコードポイントをその構成要素に分解し、コンポーネントがASCII範囲内にあるかどうかを確認することができます。 ICUはnormalization supportです。文字列内の各バイトに対して

0

Unicodeのコードポイントは1114111(0x10FFFF)で、これはほぼ100万文字を超えています。 1バイトは256文字を表すことができます。

簡単な答えはあなたがそれを行うことができないということです。

質問からわかるように、これは文字列内の文字にランダムアクセスするために必要です。 32ビット文字を使用します。 (私が間違っているなら私を訂正してください)。

ICUを使用し、変換器convert it into UTF-32(4バイト文字)を使用してコードを記述します。 ucnv_convertExがこれに使用される関数です。

+0

固定幅のエンコーディングに変換する必要はありません。マルチバイトのUTF-8文字表現を、実際には対応していないASCII文字で置き換えることはできますが、置換文字の "英数字"プロパティは置換された文字に対応します。だから'ë'は' a'に置き換えることができます。 – hasseg

+0

これは他の言語でも必要ですか? 。アジア言語 – Zimbabao

関連する問題