2011-05-09 1 views
4

큰 코드 기반을 가진 기존 응용 프로그램에 UTF8에 대한 지원이 추가됩니다. 이 응용 프로그램은 boost::format()을 사용하며 비 ASCII 문자로 된 출력이 제대로 정렬되지 않습니다. 특히 %{width}.{length} 지정자를 사용할 때 boost::format()은 utf8 문자열로 "올바른 작업을 수행하지"않는 문자를 계산합니다. 문자열 길이 코드 (은 아마도string::size())를 utf8len() 또는 비슷한 것을 사용하여 변경할 수 있어야한다고 생각합니다. 이 경우 UTF-8 문자열로 boost :: format % s 지정자 사용

, UCS2 (또는 UCS4 또는 UTF-16 등)를 사용하여 기존의 코드베이스를 변경하는 것은 실용적이지 않지만 필요하다면 boost::format()을 수정하는 것이 가능하다. 나는 다른 누군가가이 필요성을 뛰어 넘기를 바라고 있었고 가능한 해결책을 제시 할 수 있었다.

참고 : utf8과 함께 로케일을 사용할 때 일부 웹 페이지가 발견되었지만 대부분이 스트림의 utf8 및 UCS4와의 변환에 더 적합합니다.

+1

'boost :: format()'은 문자 수를 계산할 때 _bytes_를 의미합니다. 그렇습니까? – cjm

+0

유니 코드에서 "정렬"이란 무엇을 의미합니까? 그것은 근본적으로 유니 코드가 아닌 ASCII입니다. 예 : http://mothy.org/hacks/unicodewidth/UnicodeWidth.html. 아주 간단한 예를 들면 : "A". 아마 2 자 정도 여야합니다. 당신을 생각해보십시오, 그건 "A"가 아닙니다. 그것은 U + FF21, 전폭 라틴어 캐피탈 A. – MSalters

+0

@cjm입니다. - 예, 바이트는 정확합니다. 논리적으로 인쇄 된 단위에서와 같이 문자가 아닌 "char"의 복수형과 같이 "chars"를 언급했지만. – Grognard61

답변

1

이것은 아마도 당신에게 너무 늦었 겠지만 다른 사람에게 도움이 될 것입니다. Boost :: format은 선택적 템플릿 매개 변수로 std :: locale을 허용합니다. (http://www.boost.org/doc/libs/1_55_0/libs/format/doc/format.html 참조). boost :: locale ("en_US.UTF-8")과 같이 유니 코드 인식 로케일을 전달하면 원하는 동작을 얻게됩니다.

매번 로캘을 boost :: format 생성자에 전달하는 대신 다른 문제를 방지하는 데 도움이되는 응용 프로그램의 기본 로캘을 설정할 수도 있습니다. 만약 당신이 explicate (docs here)에 물어 보지 않는다면 boost :: locale 's는 숫자 형식을 변경하지 않으므로이 경로를 사용하면 std :: locale보다 boost :: locale을 사용할 것을 권장합니다.

일반적으로 이것은 C++의 응용 프로그램을 만들기위한 goto 접근 방식으로 유니 코드와 잘 작동합니다. 이 기능이 로케일 (std :: regex, std :: sort, boost :: format)을 사용할 수 있고 유니 코드 인식 로케일을 제공하면 안전해야합니다 ('나에게 말해주십시오. 알고 싶습니다.).

작고 가벼운 응용 프로그램을 만들고 80 % 케이스 만 신경 쓰는 경우 제공 할 때 기본 엔진 부스트 로케일 인 ICU (유니 코드 용 국제 구성 요소)를 포함하는 가격을 지불하고 싶지 않을 수 있습니다 유니크 지원. 이 경우 OS 또는 Posix 유니 코드 지원을 사용하여 Boos를 빌드하면 응용 프로그램은 작고 가벼운 상태로 유지되지만 여러 데이터 정렬 수준과 같은 유니 코드 지원은 많지 않습니다.

설명하는 문제의 경우 Posix 지원이 충분할 수 있습니다.

관련 문제