Обробка Unicode в C ++


Відповіді:


81
  • Використовуйте ICU для роботи зі своїми даними (або подібною бібліотекою)
  • У власному сховищі даних переконайтеся, що все зберігається в одному кодуванні
  • Переконайтеся, що ви завжди використовуєте свою бібліотеку Unicode для цілісних завдань, таких як довжина рядка, статус великих літер тощо. Ніколи не використовуйте стандартні вбудовані бібліотеки, як-от is_alpha якщо це не визначення, яке ви хочете.
  • Я не можу цього сказати достатньо: ніколи не повторюйте показники а, stringякщо ви дбаєте про правильність, завжди використовуйте для цього свою бібліотеку Unicode.

Якщо ви не трактуєте stringяк бінарні дані.
Демі

10

Якщо вам не байдуже зворотна сумісність з попередніми стандартами C ++, поточний стандарт C ++ 11 має вбудовану підтримку Unicode: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Тож справді найкращою практикою для обробки Unicode в C ++ було б використання вбудованих засобів для цього. Однак це не завжди можливо із більш старими базами коду, при цьому стандарт є таким новим в даний час.

EDIT: Для уточнення, C ++ 11 усвідомлює Unicode тим, що тепер він підтримує літерали Unicode та рядки Unicode. Однак стандартна бібліотека має лише обмежену підтримку для обробки та перетворення Unicode. Для ваших поточних потреб цього може бути достатньо. Однак якщо вам зараз потрібно зробити велику кількість важкого підйому, можливо, вам все ж доведеться використовувати щось на зразок ІКУ для більш глибокої обробки. Є кілька пропозицій в даний час в роботах , щоб включати більш надійну підтримку для перетворення тексту між різними кодуваннями. Думаю (і сподіваюся), що це буде частиною наступного технічного звіту .


Посилання на проект стандартного документа не дуже корисне без посилання на певний розділ, який описує "вбудовану підтримку Unicode", яку ви обговорюєте.
Бен Коллінз

1
@BenCollins Розділ 2.14.5 "Строкові літерали" - обговорює рядкові літерали, включаючи рядкові літерали для кодувань UTF-8, UTF-16 та UTF-32. Розділ 22.4.1.4 "Шаблон шаблону codecvt" - обговорюється клас codecvt, який використовується для перетворення між кодуванням символів (включаючи UTF-8, UTF-16 та UTF-32). Більше про підтримку Unicode є в усьому документі, але, здається, це найбільш критичні розділи з цього питання.
eestrada


5

Ось контрольний список для програмування Windows:

  • Усі рядки укладені в _T ("мій рядок")
  • strlen () і т.д. функції замінені на _tcslen () і т.д.
  • Використовуйте LPTSTR та LPCTSTR замість char * та const char *
  • Запускаючи нові проекти в Dev Studio, релігійно переконайтесь, що вибрано параметр Unicode у властивостях проекту.
  • Для рядків C ++ використовуйте std :: wstring замість std :: string

11
Не використовуйте "T" рядки, символи та функції, якщо ви не збираєтеся робити збірки Unicode та ANSI. Якщо ви тільки маєте намір робити збірки Unicode, просто виконайте звичайні речі з широкими символами: L "моя широка струна" wcslen (L "моя рядок") тощо
1800 ІНФОРМАЦІЯ

Погодьтеся, використовуйте макроси _T лише якщо ви хочете загальний текст, тобто можливість кодувати і Unicode, і Ascii / MBCS.

1
Якщо ви хочете зробити Unicode і ANSI для рядків C ++, використовуйте щось на зразок typedef std :: basic_string <TCHAR> tString;
Серж

Ага так, я завжди роблю #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif, але мені подобається твій спосіб краще, Серж.
Адам Пірс

4
Чесно кажучи, я вважаю, що UTF16 - це марно, а залишити всі кодування в UTF8 простіше і набагато сумісніше з * nix.
чача15

3

Подивіться на порівняння рядків нечутливих випадків у C ++

У цьому питанні є посилання на документацію Microsoft про Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Якщо ви подивитеся на ліву сторону навігації на MSDN поруч із цією статтею, ви повинні знайти багато інформації, що стосується функцій Unicode. Це частина глави "Кодування символів" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Він має такі підрозділи:

  • Модель кодової сторінки
  • Набір символів з двобайтовими символами в Windows
  • Unicode
  • Проблеми сумісності в змішаному середовищі
  • Перетворення даних Unicode
  • Перенесення програм на базі Windows на Unicode
  • Підсумок

2

Хоча це може бути не найкращою практикою для всіх, ви можете написати власні підпрограми C ++ UNICODE, якщо хочете!

Я щойно закінчив це робити за вихідні. Я багато чого навчився, хоча не гарантую, що це 100% вільна помилка, я зробив багато тестувань і, здається, працює правильно.

Мій код знаходиться під ліцензією New BSD і його можна знайти тут:

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

Він називається WSUCONV і постачається з вибірковою програмою main (), яка перетворює між UTF-8, UTF-16 та Standard ASCII. Якщо ви викинете основний код, у вас є приємна бібліотека для читання / написання UNICODE.


1

Як було сказано вище, бібліотека - найкраща ставка при використанні великої системи. Однак іноді ви хочете обробляти речі самостійно (можливо, тому що бібліотека використовує багато ресурсів, як на мікроконтролері). У цьому випадку ви хочете просту бібліотеку, з якої можна скопіювати деталі для речей, які вам потрібні.

Приклад коду Віллоу Шлангера здається хорошим (детальніше див. Його відповідь).

Я також знайшов ще один, який має менший код, але йому не вистачає повної перевірки помилок, і він обробляє лише UTF-8, але простіше було брати деталі.

Ось список вбудованих бібліотек, які здаються пристойними.

Вбудовані бібліотеки



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.