我是Windows编程的新手,在阅读了Petzold的书后,我想知道:
使用TCHAR类型和_T()函数来声明字符串或者我是否应该在新代码中使用wchar_t和L""字符串仍然是一种好习惯?
我将只针对Windows 2000及以上版本,我的代码将从一开始就是i18n.
例:
#include <iostream>
using namespace std;
int main()
{
wchar_t en[] = L"Hello";
wchar_t ru[] = L"??????"; //Russian language
cout << ru
<< endl
<< en;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码仅打印像地址一样的十六进制值.如何打印wchar_t字符串?
以下可能不符合SO问题; 如果它超出范围,请随时告诉我离开.这里的问题基本上是,"我是否正确理解C标准,这是正确的方法吗?"
我想请求澄清,确认和更正我对C中字符处理的理解(以及C++和C++ 0x).首先,一个重要的观察:
可移植性和序列化是正交概念.
便携式东西就像C unsigned int, wchar_t. 可序列化的东西就像uint32_t或UTF-8."Portable"意味着您可以重新编译相同的源并在每个支持的平台上获得工作结果,但二进制表示可能完全不同(或者甚至不存在,例如TCP-over-carrier pigeon).另一方面,可序列化的东西总是具有相同的表示,例如我可以在Windows桌面,手机或牙刷上读取的PNG文件.便携式东西是内部的,可序列化的东西处理I/O. 便携式东西是类型安全的,可序列化的东西需要打字.</前导>
当谈到C中的字符处理时,有两组分别与可移植性和序列化相关:
wchar_t,setlocale(),mbsrtowcs()/ wcsrtombs():C标准只字未提"编码" ; 事实上,它与任何文本或编码属性完全无关.它只说"你的入口点是main(int, char**);你得到的类型wchar_t可以容纳你所有系统的字符;你得到的函数来读取输入字符序列并使它们成为可行的字符串,反之亦然.
iconv()和UTF-8,16,32:在定义明确的固定编码之间进行转码的函数/库.由iconv处理的所有编码都得到普遍理解和同意,但有一个例外.
C的便携式,编码不可知世界与其wchar_t可移植的字符类型和确定性外部世界之间的桥梁是WCHAR-T和UTF之间的iconv转换.
那么,我是否应该始终将我的字符串内部存储在与编码无关的wstring,与CRT via的接口中wcsrtombs(),并iconv()用于序列化?概念:
my program
<-- wcstombs --- /==============\ --- iconv(UTF8, WCHAR_T) -->
CRT | wchar_t[] | <Disk>
--- mbstowcs --> \==============/ <-- iconv(WCHAR_T, UTF8) ---
|
+-- iconv(WCHAR_T, UCS-4) --+
|
... <--- (adv. …Run Code Online (Sandbox Code Playgroud) 有什么方法吗?我的电脑是AMD64.
::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);
Run Code Online (Sandbox Code Playgroud)
我用的时候:
loadU(&str);
Run Code Online (Sandbox Code Playgroud)
VS2005编译器说:
Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
我正在尝试打印俄语"ф"(U + 0444 CYRILLIC SMALL LETTER EF)字符,其代码为十进制1092.使用C++,我该如何打印出这个角色?我会想到下面的内容会起作用,但......
int main (){
wchar_t f = '1060';
cout << f << endl;
}
Run Code Online (Sandbox Code Playgroud) 我改变了我的类使用std :: string(基于我在这里得到的答案,但是我有一个函数返回wchar_t*.如何将它转换为std :: string?
我试过这个:
std::string test = args.OptionArg();
Run Code Online (Sandbox Code Playgroud)
但它说错误C2440:'初始化':无法从'wchar_t*'转换为'std :: basic_string <_Elem,_Traits,_Ax>'
请问,如何wchar_t*在c ++中找出类型变量的长度?
代码示例如下:
wchar_t* dimObjPrefix = L"retro_";
Run Code Online (Sandbox Code Playgroud)
我想知道dimObjPrefix包含多少个字符
如何在win32控制台中将wchar_t*数组转换为std::stringvarStr.
例如,做:
wchar_t x;
Run Code Online (Sandbox Code Playgroud)
翻译成:
unsigned short x;
Run Code Online (Sandbox Code Playgroud) 我们x是基本的源代码字符集的任何成员.'x'并且L'x'分别是基本执行字符集和基本执行宽字符集的成员.
这是真的,积分值'x'和L'x'必须相等?看起来标准并不需要,这是有道理的.可以想象,使用说EBCDIC作为窄字符集和Unicode作为宽字符集.
是否std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')应该L'x'在某些(或任何)区域设置中等于?在这种情况下,要求它是有意义的,但我也无法在标准中找到这样的要求.同样,是std::use_facet<std::ctype<wchar_t>>(std::locale()).narrow(L'x')一样的'x'吗?
如果以上不是真的,那么这些中的哪一个
std::wcout << L'x';
std::wcout << ct.widen('x');
Run Code Online (Sandbox Code Playgroud)
应输出x?ct是一个合适的区域设置方面.