2010-03-18 4 views
4

Glib :: ustring은 UTF8에서 잘 작동 할 것으로 예상되지만 일본어 문자열로 작업 할 때 문제가 있습니다.Glib :: ustring 및 일본어 문자

== 연산자 또는 비교 방법을 사용하여 두 개의 문자열, "わ た し"및 "ワ タ シ"를 비교하면 두 문자열이 같다고 대답합니다.

이유를 모르겠다. Glib :: ustring은 어떻게 작동합니까?

비교에 잘못된 값을 얻는 유일한 방법은 다른 크기의 문자열을 비교하는 것입니다. 예를 들면 "海外 わ た わ"과 "海外 わ た".

매우 이상

...

+0

Kensou는 그가 비교하고있는 두 줄이 동일한 소리 인 히라가나와 카타카나를 쓰는 다른 방법이라고 언급하지 않았습니다. 카타카나는 외국어 나 "빌린"단어에 사용되는 반면 히라가나는 문법에 사용되며, 일본어 가사용 발음 가이드 등으로 사용됩니다. 거짓말을하는 상황에서 그는 다른 문자열 (예 : 지옥 대 "Hello")을 비교합니다 – Armentage

+0

이것은 혼합 카타카나 문자열과 히라가나 문자열이 예측할 수없는 순서로 정렬되고 중복이 배열의 초기 상태 순서에 따라 무작위로 정렬됨을 의미하기 때문에 이상한 "기능"처럼 보입니다. – Armentage

답변

1

Glib::ustring::compare 현재 로케일의 규칙에 따라 문자열을 비교하는 내부 를 이용한다. 로케일이 일본어가 아닌 다른 언어로 설정되어 있습니까?

+0

당신이 옳을 수도 있지만 UTF-8 로케일 (일본어 또는 이탈리아어에 상관없이)을 사용하는 한 UTF-8 문자를 처리 할 수 ​​있어야합니다. – baol

+0

어휘 비교가 다릅니다. 라틴 알파벳 로케일에서 비 라틴 문자가 모두 정렬되어 동일하게 비교되도록 최적화 된 가능성이 가장 높습니다. 좀 이상하게 보일지 모르지만, 우회하려면'c_str'을 얻고'strcmp()'를 사용하여 비교하십시오. – ptomato

1
#include <iostream> 
#include <glibmm/ustring.h> 
int main() { 
    Glib::ustring s1 = "わたし"; 
    Glib::ustring s2 = "ワタシ"; 
    std::cerr << (s1 == s2) << std::endl; 
    return 0; 
} 

출력 : 0

편집 :하지만 좀 더 깊이 팠 :

#include <iostream> 
#include <glibmm.h> 
int main() { 
    Glib::ustring s1 = "わたし"; 
    Glib::ustring s2 = "ワタシ"; 
    std::cout << (s1 == s1) << std::endl; 
    std::cout << (s1 == s2) << std::endl; 
    std::locale::global(std::locale("")); 
    std::cout << (s1 == s1) << std::endl; 
    std::cout << (s1 == s2) << std::endl; 
    std::cout << s1 << std::endl; 
    std::cout << s2 << std::endl; 
    return 0; 
} 

출력 :

1 
0 
1 
1 
わたし 
ワタシ 

그리고이 이상한 소리가 난다.

+0

표준 로케일이 "C"이고 시스템 로케일에 매핑되는 http://www.gnu.org/s/libc/manual/html_node/Standard-Locales.html을 참조하십시오. 요즘에는 유니 코드로 매핑됩니다. " 자세한 내용은 http://unicode.org/faq/collation.html을 참조하십시오. – Armentage

관련 문제