문제

우리의 집합을 가지고 있던 응용 프로그램 개발을 위해 ASCII 문자 집합입니다.지금,우리는 그것을 설치하는 아이슬란드에서,그리고 실행하는 문제로는 아이슬란드 문자를 나습니다.

우리는 작업을 통해 우리의 문제이지만 내가 궁금:은 거기에 좋은"가이드"거기에 대한 C++코드를 작성하는 데는 8 비트 문자는 것입니다면 제대로 작동 UTF-8 데이터에게 주어진 그것은?

내가 기대할 수 없습니다 모든 사람을 읽고 전체 유니코드,표준,하지만 무언가가 있다면 더 소화 번거로운 일상에서 벗어나고 싶으면 그것을 공유하는 팀과 함께 그래서 우리는 실행되지 않으로 이러한 문제는 다시합니다.

다시 쓰기 모두 응용 프로그램을 사용하 wchar_t 거나 일부 다른 문자열 표현은 가능하지 않습니다.나 또한 이러한 응용 프로그램을 통해 통신 네트워크는 서버와 장치를 사용하는 8 비트는 문자,그래서 심지어는 우리가 그랬다면 내부적으로 유니코드,우리는 여전히 문제가 있으로 번역에서 경계.대부분의 경우,이러한 응용 프로그램을 통과 데이터를;그들이지 않아"프로세스"텍스트에는 다른 방법으로 복사하는 것보다 그것은 장소에.

운영 체제 사용되는 Windows 및 Linux.우리가 사용하는 std::string 및 일반 구 C 문자열입니다.(묻지 않을 방어하기 위해 디자인의 결정이다.내가 하려고 해결하는 데 도움이 엉망입니다.)


여기에는 목록은 무엇이었을 제안:

도움이 되었습니까?

해결책

포괄적 인 빠른 가이드처럼 보입니다.
http://www.cl.cam.ac.uk/~mgk25/unicode.html

다른 팁

그냥 있는 8 비트 깨끗하고,대부분의 부분입니다.그러나,당신이 알고 있어야 하는 모든 비-ASCII 문자 분할에 걸쳐 여러 개의 바이트를,그래서 당신은 계정을해야합의 경우 줄 바꿈이나 자르기에 대한 텍스트를 표시합니다.

UTF-8 는 장점을 가지고 있을 수 있습니 항상 어디에 있는 멀티바이트 문자:는 경우 비트 7 트 6 비트가 재설정(바이트는 0x80-0xBF)이 뒤바이트,안 경우 비트 7 6 설정 5 는 리셋(0xC0-0xDF)그것은 바이트 중 하나로 뒤바이트;는 경우 7,6,5 설정과 4 리셋(0xE0-0xEF)그것은 바이트와 두 끄는 바이트 및입니다.수 연속 비트 세트에서 가장 중요한 조금은 총 바이트 수를 만들 문자입니다.는:

110x xxxx=두바이트 문자
1110xxxx=세바이트 문자
1111 0xxx=네바이트 문자
etc.

아이슬란드의 알파벳은 모든 포함 ISO8859-1 따라서 Windows-1252.이 콘솔 모드 응용 프로그램으로 실행된다는 점에 유의하십시 콘솔을 사용하 IBM 코드,그래서(에 따라 시스템 로케일)이 표시될 수 있습에서 437,850 나 861.윈도우는 없는 네이티브 디스플레이를 지원한 UTF-8 일;당신이 변화해야 한다 UTF-16 고 사용하는 유니코드 일으킬 수 있습니다.

전화 SetConsoleCP 및 SetConsoleOutputCP 지정 코드페이지 1252 도움이 될 것입니다,당신의 문제는 경우,그것은 콘솔 모드 응용 프로그램입니다.불행하게도 콘솔 글꼴을 선택하는 글꼴을 지원하는 코드페이지,그리고 나는 볼 수 없는 방법 설정하는 글꼴입니다.표준 비트맵 글꼴을 지원 시스템 기본 OEM codepage.

전체 유니 코드는 16 비트 문자에 맞지 않습니다. 따라서 32 비트 숯을 사용하거나 가변 폭 인코딩 (UTF-8이 가장 인기가 있습니다).

UTF-8은 문제를 염두에두고 정확하게 설계되었습니다. 내가주의해야 할 한 가지는 ASCII가 실제로 7 비트 인코딩이라는 것입니다. 따라서 인프라의 일부가 다른 목적으로 8 번째 비트를 사용하는 경우 까다로울 수 있습니다.

체크 아웃하고 싶을 수도 있습니다 ICU. UTF-8 문자열로 작업 할 수있는 기능을 사용할 수 있습니다.

아이슬란드주의는 ISO 라틴어 1을 사용하므로 8 비트로 충분해야합니다. 무슨 일이 일어나고 있는지 알아 내기 위해 더 많은 세부 사항이 필요합니다.

프랑스어, 독일어 및 대부분의 서유럽 언어와 같은 아이슬란드는 8 비트 문자 세트 (Windows의 CP1252, ISO 8859-1 일명 LATIN1 ON *X)를 사용하여 지원할 수 있습니다. 이것은 유니 코드가 발명되기 전의 표준 접근법이었으며 여전히 매우 일반적입니다. 당신이 말한 것처럼, 당신은 앱을 다시 작성하여 WCHAR을 사용할 수 없다는 제약이 있습니다.

UTF-8이 문제를 일으키고 있다는 사실에 놀라지 않아야합니다. UTF-8은 비 ASCII 문자 (예 : 악센트 라틴 문자, 가시, ETH 등)를 각각 두 바이트로 인코딩합니다.

주어질 수있는 유일한 일반적인 조언은 매우 간단합니다 (이론적으로) : (1) 시스템에서 지원할 문자 세트 (유니 코드, Latin1, CP1252, ...)를 결정하는 경우 (2) 공급중인 경우 다른 방식으로 인코딩 된 데이터 (예 : UTF-8) 그런 다음 다른 방식으로 인코딩 된 데이터를 공급 해야하는 경우 시스템 국경 (3)에서 표준 (예 : CP1252)으로 트랜스 코딩하십시오.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top