Я действительно смущен этим unicode по сравнению с многобайтовой вещью.
Скажите, что я компилирую свою программу в Unicode (но в конечном счете, я хочу решение, которое независимо от используемого набора символов).
1) Весь 'символ' будет интерпретироваться как широкие символы?
2) Если у меня есть простой printf оператор, т.е. printf ("Привет World\n"); без символьных строк я могу просто оставить его быть, не используя _tprintf и _T ("... ")? Если printf оператор включает символьную строку, то я должен использовать _tprintf и _T ("... "), т.е. _tprintf ("Привет %s\n", имя);?
3) Если у меня есть текстовый файл (сохраненный в формате по умолчанию, т.е. не изменяя используемый набор символов по умолчанию), что я хочу читать в буфер, я могу все еще использовать символ вместо TCHAR? Особенно, если я читаю его символ символом, т.е. путем постепенного увеличения символьного указателя?
Спасибо.
С уважением, Рэйни
Во-первых, если вы компилируете с 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, а затем основывайте свои решения на этом.
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.
Допустим, я компилирую свою программу в Unicode (но в конечном итоге мне нужно решение, не зависящее от используемого набора символов).
Это будет зависеть от вашего языка - как в языке программирования, а не в человеческом разговоре. Что вы имеете в виду под «компилированием моей программы в Unicode»?
Будут ли все «char» интерпретироваться как широкие символы?
Если у меня есть простой оператор printf, например printf ("Hello World \ n"); без символьных строк, могу ли я просто оставить это без использования _tprintf и _T ("...")? Если оператор printf включает строку символов, тогда я должен использовать _tprintf и _T ("..."), т.е. _tprintf ("Hello% s \ n", name); ?
fwprintf ()
, для печати строк широких символов.Если вам нужна информация о вашем конкретном компиляторе, укажите в своем вопросе правильную информацию. Если у меня есть текстовый файл (сохраненный в формате по умолчанию, т. Е. Без изменения используемого набора символов по умолчанию), который я хочу прочитать в буфер, могу ли я по-прежнему использовать char вместо TCHAR? Особенно, если я читаю его посимвольно, т.е. увеличивая указатель на символ?
freopen ()
).