2016-03-29 12 views
0

私のC++コードでは、文字列がエンコードされているかどうか、またはエンコードの種類に関係なく、大文字と小文字を区別しない比較が必要です。文字列はASCIIでも非ASCIIでもかまいません。正しいロケールが設定されているかどうかに関わらず、それをそのまま保存して2番目の文字列と比較するだけです。C++でUnicode-Agnosticの大文字と小文字を区別しない比較を実現する方法

ユースケース:私のアプリケーションが最初に "ZoëSaldaña.txt"という文字列(ファイル名としましょう)を受け取り、それをそのまま保存するとします。その後、別の文字列 "zoësaLdañA.txt"を受け取り、これと最初の文字列の比較は、いくつかのAPIを使用して一致する必要があります。ファイル名 "abc.txt"と "AbC.txt"と同じです。

私はIBMのICUと、デフォルトでUTF-16エンコーディングをどのように使用しているかについて読んだ。

  1. をICUがシームレスにかかわらず、エンコードの種類の文字列を処理することにより、私の要件を解決するための手段を提供している場合:私は知って興味?

  2. ICUのAPIを使用して、答えが「いいえ」の場合、すべての文字列(ASCIIと非ASCIIの両方)をUTF-16に正規化し、大文字と小文字を区別しない比較やその他の操作?

  3. これを容易にする代替手段はありますか?

私はこのpostを読んでいますが、それは私の要件を満たしていません。

ありがとうございます!

+3

に関連していないです。トルコでは、 "FILE"は "file"と一致してはいけません。 ( "FİLE"は "file"と一致し、 "FILE"は "fıle"と一致するはずです)。それが明白でない場合には、トルコ語には点線のi(iとİ)とドットのないi(ıとI)があります。 –

+0

文字列はどのようにエンコードされていますか?ソースエンコーディングが何であるかを少なくとも知っていなければ、何も役に立ちません。 –

+1

ユースケースは本当にちょっとばかです。ファイル名については、大文字と小文字を区別しないと恣意的に判断することはできません。ほとんどのUnixライクなファイルシステム上のファイルは、好きかどうかにかかわらず大文字と小文字を区別しません。 Windows/NTFSの場合は、そのディスクに格納されているケーステーブルを使用して大文字小文字を区別しません。 – MSalters

答えて

4

要件はありません。コンピュータは文字では動作しません。数字で動作します。しかし、 "大文字と小文字を区別しない"比較は文字に作用する操作です。ロケールは、どの数字がどの文字に対応するかを判断するため、不可欠です。

上記は、すべてのプログラミングランゲージで真実ではなく、大文字と小文字を区別して比較する場合にも当てはまります。文字から数字へのマッピングは必ずしも一意ではありません。つまり、2つの数値を比較しても機能しません。文字42が文字43に相当するロケールが存在する可能性があります。Unicodeでは、さらに悪化します。異なる長さを有し、依然として等価である数が存在する。 (特に、あらかじめ合成され、分解された文字)

+2

ユニコードは恐ろしく、完全で完全な悪夢です。本当に恐ろしいことは、前に行ったことよりもはるかに優れていることです。 –

+1

@MartinBonner:まあ、1つのエンコーディングを持つ約6000の言語(方言を無視する)は挑戦です。つまり、あなたは、理論上、「絵文字のような完全な愚かなものを使わずに、「Unicode Light」を導入することができますが、どのようなコストですか? – MSalters

+0

絵文字はまったく問題ありません(ただの文字です)。私は悪夢だと思う "ラテン大文字A以上のリング"と "ラテン大文字A" + "上の組み合わせリング"( "看板"を忘れることなく)のようなものです。 (「ラテン大文字A」+「上乗せ」+「上乗せCEDILA」は、「ラテン大文字A」+「上乗せCEDILA」+「上の連合」と同等)と比較する必要があります。私の好きな例は、ドイツ語の "MASS"の小文字バージョンは、それがどの単語であるかに応じて "Maß"または "Mass"であるということです。 –

2

エンコーディングを知らないと、そのことはできません。私はフランス語のアクセント付き文字と2つの異なるエンコードを使用して1つの例を取り上げます:cp850は西ヨーロッパ地域のウィンドウのOEMキャラクタとして使用され、よく知られているiso-8859-1(latin1とも呼ばれ、win1252とほとんど変わりません)ansi文字ウィンドウのために設定されます))。CP850に

  • 、0x96が0x96は、非印刷可能(*)であり、0xeaはLATIN1に'Û'
  • ある、0xcaは'╩'で、'û'文字列場合、0xcaは'Ê'で、0xeaので'ê'

あります0xaaは0x96と同じでなければならず、0xcaは別の文字です

文字列がlatin1であれば、0xeaは0xcaと同じでなければなりません。0x96はコントロールチャンネルですaracter

他のiso-8859-xエンコーディングと同様の例がありますが、私が知っている言語のみを話すことができます。 CP1252 0x96で

(*)を使用すると、大文字と小文字を区別しないロケールを知らなくても、比較を行うことはできません'–' Unicode文字U + 2013 'ê'

関連する問題