Unicode по сравнению с многобайтовым

Я действительно смущен этим unicode по сравнению с многобайтовой вещью.

Скажите, что я компилирую свою программу в Unicode (но в конечном счете, я хочу решение, которое независимо от используемого набора символов).

1) Весь 'символ' будет интерпретироваться как широкие символы?

2) Если у меня есть простой printf оператор, т.е. printf ("Привет World\n"); без символьных строк я могу просто оставить его быть, не используя _tprintf и _T ("... ")? Если printf оператор включает символьную строку, то я должен использовать _tprintf и _T ("... "), т.е. _tprintf ("Привет %s\n", имя);?

3) Если у меня есть текстовый файл (сохраненный в формате по умолчанию, т.е. не изменяя используемый набор символов по умолчанию), что я хочу читать в буфер, я могу все еще использовать символ вместо TCHAR? Особенно, если я читаю его символ символом, т.е. путем постепенного увеличения символьного указателя?

Спасибо.

С уважением, Рэйни

13
задан Jonathan Leffler 9 February 2010 в 03:38
поделиться

3 ответа

Во-первых, если вы компилируете с UNICODE / _UNICODE и не собираетесь настраивать таргетинг на другие платформы , вы можете не использовать бизнес TCHAR и использовать WCHAR (или wchar_t ) и функции W.

1) Все ли 'char' будут интерпретироваться как широкие символы?

char в C - по определению - 1 байт. (Это технически не препятствует тому, чтобы он был «широким символом» на платформах, где wchar_t также составляет 1 байт, но, учитывая, что вы используете MSVC и ориентируетесь на платформы Windows, это не будет case.)

Итак, для практических целей ответ на этот вопрос: нет.

2) Если у меня есть простой оператор printf, например printf ("Hello World \ n"); без символьных строк, могу ли я просто оставить это без использования _tprintf и _T ("...")? Если оператор printf включает строку символов, тогда я должен использовать _tprintf и _T ("..."), т.е. _tprintf ("Hello% s \ n", name); ?

Если вы печатаете строковые литералы ASCII, вы можете продолжить использовать printf .

Если вы печатаете произвольные строки, которые могут находиться за пределами диапазона ASCII, вы должны использовать _tprintf (или wprintf ).

3) Если у меня есть текстовый файл (сохраненный в формате по умолчанию, т. Е. Без изменения используемого набора символов по умолчанию), который я хочу прочитать в буфер, могу ли я по-прежнему использовать char вместо TCHAR? Особенно, если я читаю его посимвольно, т.е. увеличивая указатель на символ?

Что такое «формат по умолчанию»?

Когда вы читаете внешний файл, вы должны читать первые несколько байтов сначала проверьте спецификацию UTF-16 или UTF-8, а затем основывайте свои решения на этом.

4
ответ дан 2 December 2019 в 01:57
поделиться

1) Все ли 'char' будут интерпретироваться как широкие символы?

Нет. Но все TCHAR будут интерпретироваться как wchar_t s

Подумайте, как winnt.h, вероятно, определит это:

#ifdef UNICODE
 typedef WCHAR TCHAR;
#else
 typedef CHAR TCHAR;
#endif

Когда вы вызываете SomeApi () он будет перенесен в SomeApiA (char * arg) или SomeApiW (wchar_t * arg) . (аргументы на самом деле будут TCHAR , но вы поняли).

Таким образом, ваш исходный код будет «независимым» в том смысле, что он может быть скомпилирован в версию «ANSI» или Widechar. Для этого вам нужно использовать TCHAR вместо примитивных типов.

2) Если у меня есть простой оператор printf, например printf ("Hello World \ n"); без символьных строк, могу ли я просто оставить это без использования _tprintf и _T ("...")? Если оператор printf включает строку символов, тогда я должен использовать _tprintf и _T ("..."), т.е. _tprintf ("Hello% s \ n", name); ?

Я не знаю семейство tprintf , кроме того, что могу предположить, что они работают так же, как и определения выше.То есть tprintf принимает TCHAR в качестве аргумента и в зависимости от параметра UNICODE обрабатывает их как char s или wchar_t с.

3) Если у меня есть текстовый файл (сохраненный в формате по умолчанию, т.е. без изменения используемого набора символов по умолчанию), который я хочу прочитать в буфер, могу ли я по-прежнему использовать char вместо TCHAR? Особенно, если я читаю его посимвольно, т.е. увеличивая указатель на символ?

Какая кодировка символов используется в содержимом файла, зависит от него самого и не имеет ничего общего с TCHAR s. TCHAR предназначены для имен файлов и таких, которые вы используете в вызовах Win32 API.

2
ответ дан 2 December 2019 в 01:57
поделиться

Допустим, я компилирую свою программу в Unicode (но в конечном итоге мне нужно решение, не зависящее от используемого набора символов).

Это будет зависеть от вашего языка - как в языке программирования, а не в человеческом разговоре. Что вы имеете в виду под «компилированием моей программы в Unicode»?

  1. Будут ли все «char» интерпретироваться как широкие символы?

    • Это зависит от языка и выбранных опций. Например, Java использует 16-битные символы (хранит UTF-16 или UCS-2 - когда-то давным-давно это был UCS-2, но я предполагаю, что теперь это UTF-16). В C вам придется довольно усердно поработать, чтобы получить базовый тип char, интерпретируемый как нечто иное, чем 8-битное количество - по крайней мере, в компиляторах на основе Unix.
  2. Если у меня есть простой оператор printf, например printf ("Hello World \ n"); без символьных строк, могу ли я просто оставить это без использования _tprintf и _T ("...")? Если оператор printf включает строку символов, тогда я должен использовать _tprintf и _T ("..."), т.е. _tprintf ("Hello% s \ n", name); ?

    • Это требует некоторого понимания платформы, над которой вы работаете, поскольку она далека от стандарта. Я подозреваю, что это MSVC ... из-за чего мне сложнее быть авторитетным, поскольку я не использую MSVC. Однако стандарт ISO C99 (который официально не поддерживается MSVC) предоставляет такие функции, как fwprintf () , для печати строк широких символов.Если вам нужна информация о вашем конкретном компиляторе, укажите в своем вопросе правильную информацию.
  3. Если у меня есть текстовый файл (сохраненный в формате по умолчанию, т. Е. Без изменения используемого набора символов по умолчанию), который я хочу прочитать в буфер, могу ли я по-прежнему использовать char вместо TCHAR? Особенно, если я читаю его посимвольно, т.е. увеличивая указатель на символ?

    • Опять же, TCHAR не является стандартным - он очень специфичен для MSVC. В стандарте C файловый поток приобретает «ориентацию» (широко-ориентированную или побайтно-ориентированную), когда вы применяете к нему соответствующие функции. Он остается в этой ориентации до закрытия (или повторного открытия с помощью freopen () ).
0
ответ дан 2 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: