2008-09-25 4 views
10

우리는 ASCII 문자 세트 용으로 개발 된 일련의 응용 프로그램을 보유하고 있습니다. 이제 우리는 아이슬란드에 설치하려고 시도하고 있으며, 아이슬란드 문자가 엉망이되는 문제에 직면 해 있습니다.UTF-8에 안전 한 코드는 어떻게 작성합니까?

우리는이 문제를 해결하려고 노력하고 있습니다. 궁금한 점은 : 8 비트 문자 용으로 설계된 UTF-8 데이터가 제공 될 때 올바르게 작동하는 C++ 코드를 작성하기위한 좋은 "가이드"가 있습니까? 그것?

모든 사람이 유니 코드 표준 전체를 읽을 수는 없지만 더 많은 것을 소화 할 수있는 것이 있다면 팀과 공유하고 싶습니다. 그래서 우리는이 문제에 다시 부딪치지 않습니다.

wchar_t 또는 다른 문자열 표현을 사용하도록 모든 응용 프로그램을 다시 작성하는 것은 현재로서는 불가능합니다. 또한이 응용 프로그램은 네트워크를 통해 8 비트 문자를 사용하는 서버 및 장치와 통신하므로 내부적으로 유니 코드를 사용하더라도 경계에서의 번역 문제는 여전히 남아 있습니다. 대부분이 애플리케이션은 데이터를 전달합니다. 텍스트를 다른 곳으로 복사하는 것 이외의 방식으로 텍스트를 "처리"하지 않습니다.

사용되는 운영 체제는 Windows 및 Linux입니다. std :: string과 평범한 C 문자열을 사용합니다. (그리고 디자인 결정 중 하나를 방어하기 위해 저를 요구하지 않습니다 난 그냥 혼란을 해결하기 위해 노력하고있어..) 여기


제안 된 내용의 목록입니다

+0

앱의 OS를 확인해 주시겠습니까? Windows 용으로 프로그래밍하고 있습니까? 당신이 대량으로 std :: string 또는 더 낮은 수준의 C 헤더를 사용하고 있습니까? – paercebal

+0

당신이 대답을 좋아한다면, 그것을 upvote주세요 - 인색 할 이유가 없습니다. –

+0

단 30 분 만에, 당신은 이미 rep boost를 요구하고 있습니까? :) –

답변

-1

당신은 넓은 C를 사용할 수 있습니다 haracters (wchar_t 대신 char 및 std :: wstring 대신 std :: string). 이것은 자동으로 문제의 100 %를 해결하지는 않지만 좋은 첫 번째 단계입니다.

또한 유니 코드를 인식하는 문자열 함수를 사용하십시오 (설명서 참조). 무언가가 넓은 문자 나 문자열을 조작하면 일반적으로 그것들이 넓다는 것을 알고 있습니다.

+0

다른 문자 표현을 사용하기 위해 모든 응용 프로그램을 다시 작성하는 것은 불가능합니다. –

1

전체 유니 코드는 16 비트 문자에 맞지 않는다는 것을 알고 있어야합니다; 따라서 32 비트 문자 또는 가변 폭 인코딩 (UTF-8이 가장 많이 사용됨)을 사용하십시오.

0

아이슬란드 어는 ISO 라틴어 1을 사용하므로 8 비트이면 충분합니다. 우리는 무슨 일이 일어나고 있는지 알아 내기 위해 더 자세한 정보가 필요합니다.

+0

나는 잘못된 것을 알아내는 데 도움을 줄 사람이 필요하지 않습니다. 나는 UTF-8을 다루기위한 일반적인 지침과 "베스트 프랙티스"를 찾고있다. –

1

UTF-8은 사용자의 문제점을 염두에두고 설계되었습니다. 한 가지주의 할 점은 ASCII는 실제로 7 비트 인코딩이므로 인프라의 일부가 8 번째 비트를 다른 용도로 사용하는 경우 까다로운 작업 일 수 있습니다.

+0

그렇습니다. 그래서 우리는 UTF-8이 문제를 일으킨다는 사실에 놀랐습니다. 우리는 여덟 번째 비트와 관련해서는 특별한 일을하지 않고 있지만, 텍스트가 오해되거나 어떤 식 으로든 수정되게 만드는 몇몇 장소에서 일을하고있는 것처럼 보입니다. –

+1

ASCII는 char 당 1 바이트입니다. UTF-8은 문자 당 멀티 바이트입니다 (ASCII가 아니기 때문에 Iclandic 카운트). 따라서 char 당 1 바이트를 가정하는 모든 메서드는 작동하지 않습니다. 예 :length() –

10

대부분 8 비트입니다. 그러나 비 ASCII 문자가 여러 바이트로 분할된다는 것을 알고 있어야하므로 표시 할 줄 바꿈 또는 잘림 텍스트를 고려해야합니다.

UTF-8에는 멀티 바이트 문자가있는 위치를 항상 알 수있는 장점이 있습니다. 비트 7이 설정되고 비트 6이 재설정되면 (바이트는 0x80-0xBF), 이는 후행 바이트입니다. 7과 6이 설정되고 5가 재설정됩니다 (0xC0-0xDF). 하나의 후행 바이트가있는 선두 바이트입니다. 7, 6 및 5가 설정되고 4가 재설정되면 (0xE0-0xEF) 두 개의 후행 바이트가있는 선두 바이트가됩니다. 최상위 비트에 설정된 연속 비트 수는 문자를 구성하는 총 바이트 수입니다. 즉 :

110X XXXX = 2 바이트 문자
1110 XXXX = 3 바이트 문자
1111 0xxx = 4 바이트 문자
등 아이슬란드 알파벳의 모든 ISO 8859-1에 포함되어

따라서 Windows-1252. 이것이 콘솔 모드 응용 프로그램 인 경우 콘솔이 IBM 코드 페이지를 사용하므로 시스템로 I 일에 따라 437, 850 또는 861으로 표시 될 수 있습니다. Windows에는 UTF-8에 대한 네이티브 디스플레이 지원이 없습니다. UTF-16으로 변환하고 유니 코드 API를 사용해야합니다.

코드 페이지 1252를 지정하여 SetConsoleCP 및 SetConsoleOutputCP를 호출하면 문제가 콘솔 모드 응용 프로그램 인 경우 도움이됩니다. 불행히도 선택된 콘솔 글꼴은 코드 페이지를 지원하는 글꼴이어야하며 글꼴을 설정하는 방법을 볼 수 없습니다. 표준 비트 맵 글꼴은 시스템 기본 OEM 코드 페이지 만 지원합니다.

1

icu을 확인하시기 바랍니다. UTF-8 문자열로 작업하기가 더 쉬워 진 기능을 사용할 수 있습니다.

0

프랑스어, 독일어 및 다른 대부분의 서유럽 어와 마찬가지로 아이슬란드 어는 8 비트 문자 세트 (Windows에서는 CP1252, * x에서는 ISO 8859-1 별명 Latin1)를 사용하여 지원할 수 있습니다. 이것은 유니 코드가 개발되기 전의 표준 접근 방식이었으며 여전히 일반적입니다. 앱에 wchar을 사용하도록 다시 작성할 수 없으며 그렇게 할 필요가 없다는 제약이 있다고합니다.

UTF-8이 문제를 일으키는 것은 놀랄 일이 아닙니다. UTF-8은 비 ASCII 문자 (예 : 악센트 라틴 문자, 가시, 종족 등)를 각각 2 바이트로 인코딩합니다.

제공 할 수있는 유일한 일반적인 조언은 (이론적으로) 매우 간단합니다 : (1) 시스템 에 (유니 코드, 라틴, CP1252, ...)을 지원하려고 설정 한 어떤 캐릭터를 결정 (2) 다른 유행에 인코딩 된 데이터를 제공해야하는 경우 시스템 테두리 (3)에서 표준 (예 : CP1252)으로 코드 변환하여 다른 형식 (예 : UTF-8)으로 인코딩 된 데이터를 제공하는 경우

+1

UTF-8은 실제로 한자에 3 바이트를 사용하고 희소 한 문자에 대해서는 4 바이트를 요구할 수도 있습니다. 해결할 경우 제대로 수정하는 것이 좋습니다. 첫 번째 바이트는 다음과 같은 수를 알려줍니다 : 110xxxxx는 2 바이트 char, 1110xxxx는 3 바이트 char, 11110xxx는 4 바이트 char을 의미합니다. – MSalters

+1

실제로 UTF-8은 U + 0800에서 U + FFFF까지의 문자에 대해 3 바이트를 사용합니다. 실제로는 중국어뿐만 아니라 여러 국가/언어에서 사용되는 스크립트 인 인도, 스리랑카, 미얀마 일명 버마, 태국, 라오스, 티베트어, 그루지야 어, 한국어 등. 아이슬란드 어에서 사용되는 문자와 관련된 "2 바이트"에 대한 나의 언급. 그의 입술을 읽으십시오 : 그는 8 비트보다 넓은 문자를 지원하기 위해이 앱을 다시 쓰지 않을 것입니다. 그래서 그는 중국인을 지원할 수 없습니다. 희귀 한 BMP가 아닌 HKSCS 문자를 사용하는 홍콩은 분명히 의문의 여지가 있습니다. –

관련 문제