2015-01-14 2 views
0

문자 일치하는 패턴의 위치를 ​​Ragel에서 얻는 것이 가능합니까?UTF-8 일치 위치

문자열 (char *)에 대한 포인터, 즉 패턴이 문자열 내부에서 발견 된 바이트 오프셋을 받는다는 것을 알고 있습니다. 문제는 UTF-8이 가변 길이 인코딩이므로 문자와 바이트를 정렬 할 필요가 없다는 것입니다. 내가 €€$$를 검색하기를 원한다면

예를 들어, 나는 2를 얻을 대신 6 싶습니다 ($ 값 0x24, 0xE282AC → →).

답변

1

Ragel은 좋아하는 언어에 포함 된 긴밀한 소스 코드를 생성합니다. 이 코드는 Ragel이나 언어 표준 라이브러리에서 제공하지 않은 라이브러리를 사용하지 않습니다. 따라서 UTF-8을 구문 분석하거나 UTF-8 문자열의 길이를 계산할 수단이 없습니다.

입니다.하지만 관심있는 문자열 부분에 대한 포인터를 제공하는 것이 좋습니다. 주어진 언어 별 도구를 사용하여 UTF-8 길이를 계산할 수 있습니다. 예를 들어, C++에서 cgxtools의 Utf8Codec::do_length 메서드 (또는 생각할 수있는 다른 라이브러리)를 사용하여 Ragel 코드가 반환 한 UTF-8 길이의 €€ 조각을 얻을 수 있습니다.

또한 Ragel을 조정하여 16 비트 문자를 사용하고 UCS-2에 as discussed by Wil Macaulay and Wincent Colaiuta을 입력 할 수 있습니다. UCS-4가있는 32 비트 문자는 더 좋을 것입니다.

unicode2ragel.rb 스크립트를 사용하여 UTF-8을 전달하는 상태 시스템을 생성하고이를 변경하여 전환 수를 계산할 수도 있습니다. (나는 그것이 작동 할 것인지 아닌지 전혀 몰랐으며, 그 상태 기계를 직접 사용하지 않았다.)

+0

내가 이해할 수없는 것이 하나 있습니다. 위의 내 질문은 암시 적 가정으로 쓰여졌 기 때문에 (미안 해요!) 내가 관심있는 패턴과 일치하는 머신을 이미 가지고 있습니다. UTF-8과 유사한 머신과 머신을 어떻게 결합해야합니까? "unicode2ragel.rb"는 무엇을합니까? 내 컴퓨터 규칙과 UTF-8 규칙 각각에서 코드 포인트를 모두 계산해야합니까? –

+0

'unicode2ragel.rb'로 일한 적이 없기 때문에, 누군가 다른 사람이 대답하기 위해 stackoverflow에 관한보다 구체적인 새로운 질문을 만들어야 할 것입니다. 'unicode2ragel.rb' 머신을 기존의 머신에 통합하는 방법과 코드 포인트를 세는 방법을 사용하는 방법에 대한 예제가 있습니다. – ArtemGr