2014-04-15 5 views
0

프로그램 :이 프로그램UTF8 문자열에 대해 C++ 문자열 지우기가 작동하지 않습니다. 어떤 라이브러리를 사용할 수 있습니까?

void foo() { 

    string sourceStr = "Tag:贾鑫@VoltDB"; 
    string insertStr = "XinJia"; 
    int start = 4; 
    int length = 2; 

    sourceStr.erase(start, length); 
    sourceStr.insert(start, insertStr); 
    cout << sourceStr << endl; 
} 

, 나는 같은 출력 싶어 "태그 : XinJia의 @의 VoltDB를",하지만 표준 문자열 삭제 및 삽입 UTF-8 문자열을 작동하지 않는 것 같다.

사용할 수있는 부스트 라이브러리가 있습니까? 이 문제를 어떻게 해결해야합니까?


다른 사람들과 이야기 한 후이 문제를 해결할 수있는 표준 라이브러리가 없다는 것을 알고 있습니다. 그래서 난 내 일을 할 수있는 기능을 작성하고이 비슷한 문제가 다른 사람과 공유하고 싶은이 funciton와

std::string overlay_function(const char* sourceStr, size_t sourceLength, 
     std::string insertStr, size_t startPos, size_t length) { 
    int32_t i = 0, j = 0; 
    while (i < sourceLength) { 
     if ((sourceStr[i] & 0xc0) != 0x80) { 
      if (++j == startPos) break; 
     } 
     i++; 
    } 
    std::string result = std::string(sourceStr, i); 
    result.append(insertStr); 

    bool reached = false; 
    j = 0; 
    while (i < sourceLength) { 
     if ((sourceStr[i] & 0xc0) != 0x80) { 
      if (reached) break; 
      if (++j == length) reached = true; 
     } 
     i++; 
    } 

    result.append(std::string(&sourceStr[i], sourceLength - i)); 
    return result; 
} 

을, 내 프로그램은 다음과 같습니다

cout << overlay_function(sourceStr, sourceStr.length(), 4+1, 2) << endl; 

는 도움이되기를 바랍니다.

+0

이 질문을 읽는 것이 좋습니다. http://stackoverflow.com/q/3011082/10077 답변 중 일부는 라이브러리 제안을 포함합니다. –

+0

"표준 라이브러리에는 UTF-8 인식 이터레이터가 없습니다." 고마워, 그게 내가 알아야 할거야. 그렇다면 UTF8 문자열 인덱스를 처리하는 자체 함수를 작성해야합니다. – xin

+0

나는 그러한 반복자를 구현하는 블로그 게시물을 찾았습니다. http://www.nubaria.com/en/blog/?p=371 –

답변

0

C++ 문자열의 인덱스는 인 인코딩 값 이고 문자 (또는 사용자의 경우 표의 문자 표기) 인덱스가 아닙니다. UTF-8을 사용하면 각 문자를 두 개 이상의 인코딩 단위로 구성 할 수 있습니다. 올바른 인코딩 단위 색인을 찾으십시오.

팁 1 : .substr+ 문자열 연결을 사용합니다.

팁 2 : :@ 문자를 검색 할 수있는 것 같습니다. 이러한 인코딩 단위는 다중 단위 UTF-8 문자로 나타날 수 없습니다. string의 메소드를 확인하십시오.

+0

제안 해 주셔서 감사합니다. 하지만 입력 문자열 형식이 확실하지 않기 때문에 두 가지 팁이 모두 잘 작동하지 않는다고 생각합니다. – xin

+0

@xin'! = 0x80' 조건은 일반적으로 UTF-8 문자에는 효과가 없으며 두 개의 인코딩 단위 만 사용할 수 있습니다 (적어도 생각하면 테스트하지 않았습니다!). 비트 패턴에 관한 것들을 가정하는 대신에, (부호없는) 코드가'> = 0x80'인지를 검사하는 것이 더 간단하고 명확하고보다 견고하고 정확합니다. 그러한 값의 실행에서 하나만 제외하고 모두 무시합니다. 즉 내부 루프를 사용하여 앞으로 스캔합니다. –