2014-06-19 2 views
0

UTF-8로 인코딩 된 문자열에서 악센트를 제거하려면 어떻게합니까? 라이브러리 함수를 사용하거나 변환 표를 사용하는 수백 가지 답변이 있습니다.UTF-8로 인코딩 된 문자열의 문자열 길이

실제 알고리즘 (그 아이디어와 그 이유는 무엇인지)을 찾고 있는데, 사용 준비가되어 있지 않습니다.

내 목표, 즉 예를 들어, utf8_strlen("Vypočítávání") = 12가. 내가 의 길이를 중국어 클링 온을 포함한 모든 문자열을 계산하고 싶습니다 그래서 (A UTF-8로 인코딩 된 문자열의 개별 문자를 계산하는 것입니다.

이미 멀티 바이트 문자를 계산하는 방법을 알고있다. 현재의 바이트의 MSB가 1 경우, 나는 좀 더 바이트가 존재하는 것을 알고 다음 몇 바이트를 보면, 그 말할 수 :

  • 110xxxxx 하나 이상을 의미 바이트가 계속됩니다.
  • 1110xxxx 두 개 더,
  • 11110xxx 세 개입니다.

는 (우리는 문자열이 올바르게 인코딩되어 있다고 가정 할 수 있습니다 즉. 순서가 유효한 UTF-8 스트림입니다. 즉, 그 바이트 실제로에 따라 것을 의미합니다.)

나는 한 바이트를 읽고 얼마나 많은 사람들이 하나의 유니 코드 코드 포인트를 지정하는지 알기 때문에, 나는 (다시, 스트림이 유효하다) 그들을 건너 뛸 수 있고 그에 따라 중간 합을 증가시킬 수있다.

문자 결합에 대해 어떻게해야합니까? 즉, 코드 포인트가 (ç 또는 중국어 이상한 곡선에서 č에서 같은 háček 또는 디유)는 예를 들어 악센트 여부를 알 수있는 간단한 방법이있다? 그렇다면 나는 그들을 건너 뛰기를 고대하고있다.

고맙습니다.

+1

네, 그렇게 할 수있는 간단한 방법이 있습니다. 불행하게도이 알고리즘은 알고리즘이 아니라 유니 코드 표준의 일부로 사용할 수있는 거대한 데이터 테이블의 테이블 조회입니다. 이들은 사용자가 수행 한 코드 포인트를 포함하여 모든 코드 포인트에 대해 모든 유형의 특성을 지정합니다. – jalf

+0

당신이 무엇을 요구하고 있는지 불분명합니다. 제목이 질문의 내용과 일치하지 않습니다.이 질문은 액센트가 결합 문자를 사용하여 표현된다는 것을 암시하는 것으로 보이지만 대부분의 경우에는 그렇지 않습니다. 그리고 처리 바이트는 여기에서 실제로 무관하다; 그것은 개념적으로 그리고 프로그래밍에서 완전히 다른 수준에 있습니다. 그리고 문자열의 길이가 의미하는 바를 정의하지 않았습니다. –

답변

2

실제로 UTF-8 시퀀스를 유니 코드 코드 포인트 (즉, UTF-8을 UTF-32로 변환)로 디코딩 한 다음 필요에 따라 코드 포인트를 조작 한 다음 나머지 코드 포인트를 다시 UTF- 필요한 경우 8.

각 UTF-8 옥텟을 파싱하여 각 시퀀스의 바이트 수를 검색하는 방법을 이미 알고 있으므로 간단하게 1-4 바이트 시퀀스를 완성하고 나머지 비트를 32 비트 값으로 구문 분석 한 다음 유니 코드 차트의 해당 값을 악센트, 분음 기호 또는 기타 결합 문자인지 확인한 다음 그에 따라 행동하십시오. 또한 해독 된 코드 포인트 값을 정규화하여 결합 문자를 쉽게 감지하거나 건너 뛸 수 있도록해야합니다.

2

이렇게하려면 TR29 (유니 코드 텍스트 분할)을 읽고 "grapheme clusters"로 세분화 한 다음 클러스터 수를 계산해야합니다.

+0

+1 더 정교한 대답을 원한다면 (같은 결론으로) [*** JavaScript에는 유니 코드 문제가 있습니다 ***] (http://mathiasbynens.be/notes/javascript-unicode#counting-symbols)를 참조하십시오. (이 예제에서는 JavaScript를 사용하지만 대부분의 기본 기술은 유니 코드에만 해당되며 모든 프로그래밍 언어에 적용됩니다.) –

관련 문제