2013-11-20 32 views
4

我是C++新手,來自非CS背景。因此,如果這個問題很愚蠢或者之前已經回答,請原諒我。如何檢查C++中字符的unicode值的範圍

我在C++中有一個字符串,語言是泰盧固語。

std::string str = "ఉంది"; // (it means exists; pronounced as Vundi) 
std::string substring = str.substr(0,3); 

上面的子字符串是「ఉ」(發音爲Vu),它的Unicode十六進制值是0C09。

如何從子字符串獲得值0C09? 目的是檢查子字符串是否在泰盧固語(0C00-0C7F)的有效範圍內。

我看過其他問題,它們適用於obj-c,java,php,c#等。我正在尋找使用std :: string的C++。

根據評論我已閱讀文章joelonsoftware.com/articles/Unicode.html

讓我用更多信息更新我的問題。 我使用的是Fedora 19 x86_64,編碼是UTF-8。控制檯能夠正確顯示文本。

根據文章,如果我正確理解ASCII是單字節字符和Unicode是多字節字符。上面的代碼示例反映了這一點,這裏每個unicode字符的長度爲3個字節。除了談論UTF-8 /文本編碼和多字節字符外,本文對檢測unicode字符串的語言沒有提供實際的幫助。

可能是我應該改一下我的問題:

我如何檢測在C++ unicode字符串語言?

在此先感謝您的幫助。使用

+2

看起來您需要了解文本編碼。關於這個主題,這是一篇不錯的文章:http://www.joelonsoftware.com/articles/Unicode.html瞭解這篇文章將使*更容易處理您面臨的問題。我推薦它:) –

+0

感謝您的信息和及時的答覆。我會閱讀文章。 – user3014442

回答

1

字符串的結果是我得到的是

std::string str = "ఉంది"; // (it means exists; pronounced as Vundi) 
unsigned short i =str[0]; 
printf("%x %d",i,i); 

輸出爲「ffeo 65504」

但是當我使用wstring的即

std::wstring str = L"ఉంది"; // (it means exists; pronounced as Vundi) 
unsigned short i =str[0]; 
printf("%x %d",i,i); 

輸出爲「 c09 3081「我想這是正確的輸出。 我不確定,但那是你想要的。讓我知道

+0

謝謝庫納爾,這正是我一直在尋找的! – user3014442

0

你可以使用ICU或者你必須手動轉換UTF-8到UTF-16/32通過查看字符串中的連續字符。有關UTF-8多字節字符的解釋,請參閱here

ICU還包括unicode字符屬性,這可能是有用的,例如,用於檢測腳本。

std::string沒有任何對UTF-8到UTF-16/32轉換的內置支持,所以substr也不能返回一個Unicode字符。

+0

我同意你的意見。我不太喜歡使用外部庫,抱歉應該提到這一點。除了角色的十六進制值之外,不需要任何這些特殊屬性和國際化。 – user3014442

+0

正如@Neet所提到的,ICU還有「範例字符」(實際上由泰盧固語使用的字符),「UnicodeSet」(用於執行字符範圍操作)以及角色道具。這些爲您提供了很多「檢測字符串可能是哪種語言」的工具,但缺乏完整的語言分析。 ICU的撰寫是爲了使這些操作能夠以一致的跨平臺方式提供。有人可能會說「不是外部圖書館!」或者「太大了!」但是,它需要工作才能獲得這個權利...... –

0

您需要將您的編碼(utf8可能)(char *)轉換爲寬字符(wchar_t)。

有關此轉換的更多信息,您可以看到this postthis one