2012-12-05 4 views
3

유니 코드 문자열 (특히 영어, 독일어, 스페인어 및 아랍어)을 하드웨어 장치에 읽고 쓸 필요가있는 소프트웨어 (C#)를 작성하려고합니다. 펌웨어 개발자는 자신의 코드가 각 문자열을 하나의 이진 파일에 고정 길이 바이트 배열로 저장하려고하므로 인덱스 (index * length = starting offset)를 사용하여 모든 문자열에 빠르게 액세스 할 수 있고 고정 길이 바이트 수를 읽을 수 있다고 알려줍니다). .NET은 내부적으로 유니 코드 코드 포인트의 수에 따라 기술적으로 가변 길이 인코딩이라고 생각하는 UTF-16 인코딩을 사용합니다. 영어, 독일어, 스페인어 모두 UTF-16을 사용하여 인코딩 할 때 2 바이트/문자를 사용하지만 아랍어에 대해서는 확실하지 않습니다. UTF-16으로 각각 3 바이트를 요구할 수있는 아랍어 문자가있을 수 있으며, 이는 펌웨어 개발자가 문자열을 고정 길이로 저장할 계획을 깬 것으로 보입니다.유니 코드 문자열의 고정 길이 저장을위한 적절한 인코딩?

먼저 UTF-8/UTF-16 인코딩의 가변 길이 특성에 대한 내 이해를 확인할 수 있습니까? 둘째, 많은 공간을 낭비 하겠지만 각 문자열을 고정 길이로 저장할 수있는 최상의 옵션은 UTF-32 (고정 크기, 각 문자는 4 바이트를 사용하여 표현됨)입니까? 감사!

+0

문제가 발생하는지 잘 모르겠습니다. 인코딩 된 문자열이 고정 필드 길이를 초과하지 않는 한 가변 길이 인코딩을 사용하면 어떤 문제가 발생합니까? 문자열의 끝과 사용되지 않은 나머지 바이트 사이의 경계를 표시하는 방법에 동의해야하지만 고정 길이 인코딩을 사용하는 경우에도이 문제가 적용됩니다. – shambulator

+0

또한 UTF-16은 문제가되지 않습니다. 위키에 따르면 대부분의 아랍어는 Basic Multilingual Plane에 적합합니다. 즉, 대부분의 경우 코드 포인트 당 하나의 16 비트 코드 단위를 사용할 수 있습니다. 실패하면 2 개의 코드 단위를 사용합니다 (총 4 바이트이지만 UTF-16에서는 3을 사용하지 않습니다). 아마 당신이 나타내는 데 필요한 범위 *를 정확히 아는 것이 가장 좋습니다.http://en.wikipedia.org/wiki/Arabic_script_in_Unicode – shambulator

+0

유니 코드에는 고정 길이가 없습니다. utf8everywhere.org의 "길이"참조 –

답변

2

유니 용어 :

  • 이 유니 코드 문자 세트 내의 각 엔트리는
  • 인코딩 코드 포인트가 변환 형식의 하나 이상의 코드 단위 구성 코드 포인트 (UTF- 8은 8 비트를 사용합니다 코드 단위, UTF-16은 16 비트 코드 단위를 사용합니다)
  • 사용자가 볼 수있는 글자체는,633,210

: 그래서, UTF-8

  • 코드 포인트 넓은 1, 2, 3 또는 4 옥텟
  • UTF-16 코드 포인트
  • 넓은 2 개 또는 4 옥텟 UTF-32
  • 코드 포인트 폭 4 개 옥텟
  • 코드 포인트의 수보다 작을 수있는 스크린에 렌더링 자모의 수

그래서 전체 유니 코드 범위를 지원하려면 인코딩으로 선택한 UTF 중 어떤 것과 관계없이 고정 길이 문자열을 32 비트의 배수로 만들 필요가 있습니다 (사용되지 않은 바이트는 0x0으로 설정됩니다) I/O 중에 잘라내어 추가 할 것입니다.)

사용자 인터페이스를 통해 길이 제한을 전달하는 측면에서 코드 단위 크기와 일반 고객을 기준으로 몇 가지 절충안을 결정할 수 있습니다. 당신이 구축 할 수있는 가장 복잡한 자필의 너비를 찾으십시오.

관련 문제