2009-11-24 4 views
0

문자열 처리를 수행하는 작은 C++ 응용 프로그램을 만들고 있습니다. 현재 특정 문자 인덱스에서 문자열을 추출하고 싶습니다. 문자열의 at() 메서드를 사용하여 내 순진한 솔루션을 잘 작동하지만 비 ASCII 문자열을 나누기. 예를 들어 :C++에서 비 ASCII 문자열 색인 문자

string test = "ヘ(^_^ヘ)(ノ^_^)ノ" 
cout << test.at(0) << endl; 

은 GCC 4.2에서 나를 위해 출력으로 파운드 기호를 생성합니다. 나는 전체 문자열을 잘 인쇄 할 수 있기 때문에 터미널에 문제가 있다고 생각하지 않는다. 원하는 효과를 내기 위해 사용할 수있는 라이브러리가 있습니까?

답변

2

string은 단지 8 비트 인 char을 사용합니다. 16 비트 문자를 인코딩하려면 wstring을 사용해야합니다.

+0

그리고'표준 : wcout' :

여기 쉽게 PHP에서 번역 될 수있는 하나 – GManNickG

1

문자열은 UTF-8 일 것입니다. "문자"와 "바이트"는 같은 것이 아닙니다. std::string 클래스는 "문자"가 각각 1 바이트라고 가정하므로 결과가 잘못되었습니다.

옵션은 대신에, 당신은 (일반적으로) 문자가 모두 두 바이트 (A wchar_t 또는 short)가 있다고 가정 할 수있는 각 wstring를 UTF-16 문자열을 변환하여 사용할 수 있습니다, 또는 당신은 ICU 같은 라이브러리를 사용할 수 있습니다 또는 UTF8-CPP이 UTF-8 문자열을 직접 조작하여 "3 번째 바이트 얻기"보다는 "3 번째 문자 얻기"와 같은 일을합니다.

최소형으로 가고 싶다면 UTF-8 문자열 길이 함수 중 하나의 내부를 다시 사용하여 특정 문자의 바이트 오프셋과 길이를 얻는 간단한 함수를 코딩 할 수 있습니다 위에 나열된 라이브러리 중 하나 또는 google에서 가져 왔습니다. 기본적으로 각 캐릭터를 검사하고 앞으로 1-3 바이트를 뛰어 넘어 어떤 비트가 설정되어 있는지에 따라 다음 문자의 시작 부분으로 이동해야합니다.

for($i = 0; $i < strlen($str); $i++) { 
    $value = ord($str[$i]); 
    if($value > 127) { 
     if($value >= 192 && $value <= 223) 
      $i++; 
     elseif($value >= 224 && $value <= 239) 
      $i = $i + 2; 
     elseif($value >= 240 && $value <= 247) 
      $i = $i + 3; 
     else 
      die('Not a UTF-8 compatible string'); 
     } 
    $count++; 
} 

http://www.php.net/manual/en/function.strlen.php#25715

관련 문제