2012-05-17 26 views
11

、それは死んで簡単です:C++でC++でラテンUTF-8文字列の大文字小文字を変更するには? Objective-Cで

NSLog(@"%@", [@"BAÑO" lowercaseString]); // Outputs "baño". 

、同等のは何ですか?誰もこれに対して同じ出力を生成する有効なコードを提供できますか? ICU、Boost、または他のサードパーティのライブラリに頼ることなくこれを行うには良いSTL方法がありますか?

using namespace std; 
string s = "BAÑO"; 
wstring w(s.begin(), s.end()); 
transform(w.begin(), w.end(), w.begin(), towlower); 
// w contains "baÑo" 
+0

あなた自身の関数を書いてください。http://www.cplusplus.com/forum/beginner/70692/ –

+2

あなたの現在の非ソリューションはかなり私にはまともに見えます! – fluffy

+0

@fluffy私は同意する!私はこの "非ソリューション"をヘルパー関数に包んで、それをかなり良いソリューションと呼んでいます。 – dasblinkenlight

答えて

5

この問題は、C++では信じられないほど複雑であることが判明しました。私が知っている唯一のライブラリは、ユニコードの正規化や他の128-ASCII以外の文字以外の点の問題を絶対に考慮に入れていることです。

IBM's ICU

それは巨大だが、それはすべてを正しくありません。 toupperとtolowerは不幸にもこの問題では不十分であり、利用可能な他のC++構文はありません。

+0

質問は明らかにICUを排除しました。 –

+0

@Adrian本当ですが、状況の現実が問題に勝ると思われます。 objcのNSStringはユニコード文字の配列で、フードの下でICUを使用します。この場合、純粋なC++では、本質的に同じ機能を得るためにICUを組み込む必要があります。(幸いなことに、私のターゲットプラットフォームはiOSとAndroidなので、実際にはそれぞれのプラットフォームに対応する_iosと_androidの実装ファイルをobjcとjavaに分けることができます)。 – drhr

2

ロケール固有である、tolowerがあり、私はそれがUTF-8文字列では動作しないと思う:

私の現在の非ソリューションです。

大文字小文字の規則は言語に依存するため、正しい解決策は常にロケール固有のものになります。たとえば、「I」の小文字のバージョンは常に「i」ではありません。

+0

'tolower'や' towlower'などの問題は、入力文字と出力文字の間に1対1の対応関係があることです。それはupper( "ß")= "SS"のようなマッピングのためにUnicodeではうまくいかず、文字自体がUTF-8とUTF-16で可変長であることを考慮していません。 – dan04

+0

@ dan04:大文字と小文字のエンコードの長さが異なる文字はありますか? UTF-16はBMPを16ビットでエンコードし、SMPには大文字または小文字が含まれていないため、UTF-8のみで表示されます。 – MSalters

+0

@ dan04:はい、tolowerには制限がありますが、質問には明示的に標準ライブラリソリューションが求められ、サードパーティのライブラリは除外されています。したがって、これはあなたがそれらの要件で行うことができる最高です。 –

関連する問題