C ++의 유니 코드 처리


답변:


81
  • ICU 를 사용 하여 데이터 (또는 유사한 라이브러리) 처리
  • 자신의 데이터 저장소에서 모든 것이 동일한 인코딩으로 저장되어 있는지 확인하십시오.
  • 문자열 길이, 대문자 상태 등과 같은 일상적인 작업에 항상 유니 코드 라이브러리를 사용하고 있는지 확인하십시오 is_alpha. 원하는 정의가 아닌 한 표준 라이브러리 내장 기능을 사용하지 마십시오 .
  • 충분히 말할 수 없습니다. 정확성에 관심 있다면 인덱스를 반복 하지 말고 항상 유니 코드 라이브러리를 사용하십시오.string

string이진 데이터로 취급하지 않는 한 .
Demi

10

이전 C ++ 표준과의 하위 호환성에 관심이 없다면 현재 C ++ 11 표준에 유니 코드 지원이 내장되어 있습니다. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

따라서 C ++에서 유니 코드 처리에 대한 진정한 모범 사례는 내장 된 기능을 사용하는 것입니다. 하지만 기존 코드베이스에서는 항상 가능한 것은 아니지만 표준은 현재 매우 새로운 것입니다.

편집 : 명확히하기 위해 C ++ 11은 이제 유니 코드 리터럴과 유니 코드 문자열을 지원한다는 점에서 유니 코드를 인식합니다. 그러나 표준 라이브러리는 유니 코드 처리 및 변환을 제한적으로지원 합니다. 현재 필요에 따라 이것으로 충분할 수 있습니다. 그러나 지금 당장 많은 양의 무거운 작업을 수행해야하는 경우 더 심층적 인 처리를 위해 ICU 와 같은 것을 사용해야 할 수도 있습니다 . 다른 인코딩 간의 텍스트 변환에 대한보다 강력한 지원을 포함하기 위해 현재 작업중인 몇 가지 제안이 있습니다 . 내 추측 (그리고 희망)은 이것이 다음 기술 보고서의 일부가 될 것이라는 것 입니다.


초안 표준 문서에 대한 링크는 논의중인 "내장 유니 코드 지원"을 설명하는 특정 섹션에 대한 참조 없이는별로 도움이되지 않습니다.
Ben Collins

1
@BenCollins 섹션 2.14.5 "문자열 리터럴" -UTF -8, UTF-16 및 UTF-32 인코딩에 대한 문자열 리터럴을 포함하여 문자열 리터럴에 대해 설명합니다. 섹션 22.4.1.4 "클래스 템플릿 codecvt" -문자 인코딩 (UTF-8, UTF-16 및 UTF-32 포함) 간 변환에 사용되는 codecvt 클래스에 대해 설명합니다. 문서 전체에 걸쳐 유니 코드 지원에 대한 자세한 내용이 있지만 주제에서 가장 중요한 섹션 인 것 같습니다.
eestrada 2014


5

다음은 Windows 프로그래밍을위한 검사 목록입니다.

  • _T ( "my string")로 묶인 모든 문자열
  • strlen () 등 함수는 _tcslen () 등으로 대체되었습니다.
  • char * 및 const char * 대신 LPTSTR 및 LPCTSTR 사용
  • Dev Studio에서 새 프로젝트를 시작할 때 종교적으로 프로젝트 속성에서 Unicode 옵션이 선택되어 있는지 확인하십시오.
  • C ++ 문자열의 경우 std :: string 대신 std :: wstring을 사용하십시오.

11
유니 코드 및 ANSI 빌드를 모두 수행하려는 경우가 아니면 "T"문자열, 문자 및 함수를 사용하지 마십시오. 유니 코드 빌드 만 수행하려는 경우 일반 와이드 문자 작업을 수행하십시오. L "my wide string"wcslen (L "my string") 등
1800 INFORMATION

동의합니다. 일반 텍스트 (예 : 유니 코드 및 Ascii / MBCS 모두에 대한 코딩 기능)를 원하는 경우에만 _T 매크로를 사용하십시오.

1
C ++ 문자열에 대해 유니 코드와 ANSI를 모두 수행하려는 경우 typedef std :: basic_string <TCHAR> tString;
Serge

아 예, 저는 항상 #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif하지만 당신의 방식이 더 나은 Serge를 좋아합니다.
Adam Pierce

4
솔직히 UTF16은 낭비라고 생각합니다. 모든 인코딩을 UTF8로 남겨 두는 것이 더 간단하고 * nix와 더 호환됩니다.
chacham15

3

C ++ 에서 대소 문자를 구분하지 않는 문자열 비교 살펴보기

이 질문에는 유니 코드에 대한 Microsoft 문서 링크가 있습니다. http://msdn.microsoft.com/en-us/library/cc194799.aspx

해당 기사 옆에있는 MSDN의 왼쪽 탐색 부분을 보면 유니 코드 함수와 관련된 많은 정보를 찾을 수 있습니다. "문자 인코딩"( http://msdn.microsoft.com/en-us/library/cc194786.aspx ) 에 대한 장의 일부입니다.

다음과 같은 하위 섹션이 있습니다.

  • 코드 페이지 모델
  • Windows의 2 바이트 문자 집합
  • 유니 코드
  • 혼합 환경의 호환성 문제
  • 유니 코드 데이터 변환
  • Windows 기반 프로그램을 유니 코드로 마이그레이션
  • 요약

2

이것이 모든 사람에게 모범 사례는 아니지만 원하는 경우 고유 한 C ++ UNICODE 루틴을 작성할 수 있습니다!

주말에 끝냈어. 많은 것을 배웠지 만 100 % 버그가 없다고 보장하지는 않지만 많은 테스트를했고 제대로 작동하는 것 같습니다.

내 코드는 New BSD 라이선스하에 있으며 여기에서 찾을 수 있습니다.

http://code.google.com/p/netwidecc/downloads/list

WSUCONV라고하며 UTF-8, UTF-16 및 표준 ASCII간에 변환하는 샘플 main () 프로그램과 함께 제공됩니다. 메인 코드를 버리면 유니 코드 읽기 / 쓰기를위한 멋진 라이브러리가 있습니다.


1

위에서 말했듯이 라이브러리는 대형 시스템을 사용할 때 가장 좋은 방법입니다. 그러나 때로는 자신이 직접 처리하고 싶을 때가 있습니다 (라이브러리가 마이크로 컨트롤러와 같은 많은 리소스를 사용하기 때문일 수 있습니다). 이 경우 실제로 필요한 부분을 복사 할 수있는 간단한 라이브러리가 필요합니다.

Willow Schlanger의 예제 코드는 좋은 것 같습니다 (자세한 내용은 답변 참조).

나는 또한 더 작은 코드를 가지고 있지만 완전한 오류 검사가없고 UTF-8 만 처리하지만 부분을 제거하는 것이 더 간단한 다른 것을 발견했습니다.

괜찮아 보이는 임베디드 라이브러리 목록이 있습니다.

임베디드 라이브러리



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.