2010-04-08 46 views
4

如何將字符串(wstring)從小寫字母轉換爲大寫字母,反之亦然? 我搜索了網絡,發現有一個STL函數std :: transform。
但到目前爲止,我還沒有想到如何將正確的區域對象例如「Germany_german」賦予該函數。 誰可以幫忙? 我的代碼如下所示:toupper/tolower +語言環境(德語)

wstring strin = L"ABCÄÖÜabcäöü"; 
wstring str = strin; 
locale loc("Germany_german"); // ??? how to apply this ??? 
std::transform(str.begin(), str.end(), str.begin(), (int(*)(int)tolower); 
//result: "abcäöüabcäöü" 

字符AOU和AOU(它像AE,大江,UE)將無法正確轉換。

P.S .:我不喜歡大開關也我知道BOOST是有能力的一切,我更喜歡STL解決方案。

在此先感謝
哎呀

+0

界定「不正確轉換」請 – Adrian 2010-04-08 08:53:52

+0

NOOOO處理字符! '(a)setlocale(LC_ALL,「」)' - 將語言環境設置爲系統一而不是德語。 (b)'tolower'使用'char'而不是'wchar_t' - 它完全適用於我的意外,因爲8位語言環境可能是UCS的子集Latin1 ...這不是答案 – Artyom 2010-04-08 13:06:51

回答

1

如果您使用的是Unix,請參閱/usr/share/locale/瞭解可用的語言環境。它看起來像你想"de_DE.UTF-8"

setlocale(LC_ALL, "");應該設置程序在系統的語言環境中工作,不管它是什麼。

如果我只是設置默認的語言環境而不指定德國,那麼您的程序適用於我(我修正了一個關閉)。

+0

他是在windows上... German_Germany是windows風格的語言環境名稱 – Artyom 2010-04-08 09:40:57

+0

啊。所有更多的理由使用'setlocale(LC_ALL,「」);',這是標準的C++,並沒有指定一個特定的區域設置。 – Potatoswatter 2010-04-08 09:47:57

+1

C++有自己的語言環境API:'std :: locale',它與C語言環境不同。例如,可能有很多'std :: locale'實例,它的訪問通常是線程安全的。 – Artyom 2010-04-08 10:26:02

1

你嘗試"de_DE.UTF-8"對現場施工?

3

問題是tolower()/toupper()對於許多語言環境而言基本上已損壞。你如何建議toupper()應該使用包含'ß'的單詞? "Maße"的全部大寫是什麼?[1]法語和其他語言也有類似的例子。

所以首先要問自己的是爲什麼你需要這個,你想達到什麼。

如果你願意忽略所有這些問題,here是谷歌找到我的第一個話題。 (如果你想更多地瞭解谷歌,James Kanze多年來在很多C++新聞組中發佈了許多有用的見解。)

[1] - 德國人掛在這裏:):在德語中,「ß」字面意思是「sz」的連字符,不可用作大寫字母。它可以被「ss」替代,但並不總是如此。例如,「Masse」與「Maße」完全不同。

+0

爲什麼'基本破碎'?它不是可以「固定」的東西。它的語言'是' – Adrian 2010-04-08 09:29:34

+0

@Adrian:正如我寫的,所有語言環境中的所有字母都沒有大寫/小寫字母。並且在哪裏有,它並不總是1:1的字符映射。 (例如,'ß''映射到''SS'' - 至少大部分是,「Maße」是一個突出的例外。)即使考慮到這一點,映射通常是上下文相關的。 (不是所有的'「SS」映射到''ß'')如果你只是想轉換DOS文件名(ASCII <128),你沒事。如果你希望它在任何情況下都能可靠地工作,我認爲任何人都不會想出一個有效的算法。 – sbi 2010-04-08 09:36:05

+0

嚴格來說,有一個資本ß:http://en.wikipedia.org/wiki/Capital_%C3%9F 但它只用於排版中一些不起眼的角落案件。 – 2010-04-08 09:40:40

9

你需要不同的方式來應用它:

for(unsigned i=0;i<str.size();i++) 
    str[i]=std::toupper(str[i],loc); 

或者設置全局區域

std::locale::global(std::locale("Germany_german")); 

然後

std::transform(str.begin(), str.end(), str.begin(), std::toupper); 

參見:http://www.cplusplus.com/reference/std/locale/tolower/

注意1 C toupper與std :: toupper不同,它接收std :: locale作爲參數,它僅使用char作爲參數,而std::touppercharwchar_t都有效。

注2std::locale相當打破了德國,因爲它的工作性質基礎上,不能將「SS」到「SS」,但它的工作對大多數其他字符...

注3:如果您需要正確情況轉換包括像「SS」,你需要用良好的本地化庫像ICU,或Boost.Locale