┠┨2○::菜鸟理解的宽字符作用,不知对不?
c++吧
全部回复
仅看楼主
level 11
gameloftyou 楼主
是不是用宽字符风格写的软件,到任何电脑上运行都不会乱码(正确转为本地语言),而用非宽字符的软件则需要用像微软的AppLocale那样,让软件在正确语言环境下,才不乱码?
2012年07月20日 07点07分 1
level 11
gameloftyou 楼主
哦,错了,不是正确转为本地语言(那游戏就不需要汉化了[拍砖]),而是正确显示软件原来制作时的语言
2012年07月20日 07点07分 2
level 10
不是的吧。。。宽字符也有很多标准吧???UTF-8啥的???(不懂瞎说的。。。)
宽字符只是让程序编起来更好吧。。。毕竟作为一个整体而不是两个byte。。。
以上纯属口胡。。。
2012年07月20日 07点07分 3
哦,我指的是windows内部的UNICODE码
2012年07月20日 07点07分
换头像了啊~差点认不出来
2012年07月20日 07点07分
@gameloftyou 我瞎说的。。。不知道对不对。。。
2012年07月20日 07点07分
@v2abcd 某天跟风换的。。。
2012年07月20日 07点07分
level 12
没字体照样完蛋[瞌睡]
2012年07月20日 07点07分 4
level 10
宽字符好像一般是存日语,中文这类的。好像char有时放不下。但是C我一直用char字符数组也没出什么错误。(C++一般用string。)
2012年07月20日 08点07分 5
应该注意std::basic_string没有编码支持,仅依赖于指定类型的std::char_traits实例,那么窄字符实现的UTF-8和ASCII对于std::string来说其实是无法直接区分的。str.size()/str.length()可能造成类似strlen的误会。
2012年07月20日 08点07分
level 15
WinNT API支持UCS2-LE,Win2k起扩充为非定长编码UTF16-LE。
2012年07月20日 08点07分 6
我试过Code::Blocks也就是gcc需要这个-fexec-charset=UTF-16BE才能输出宽字符,害我以为UNICODE就是UTF-16BE
2012年07月20日 08点07分
@gameloftyou 现在想想也有道理,-fexec-charset这个只是在utf-8代码的基础上,将字符串的编码改成UTF-16BE,比如'a'就是00 61这种十六进制形式的。
2012年07月20日 08点07分
@gameloftyou 顺便,你需要注意C/C++中的source character set和execution character set是两个不同的概念。一般来说实现会帮你搞定其中的映射(in an implementation-defined manner),不过MinGW的我是不指望了,现在除了WinAPI我就不用wchar_t,两个默认都是UTF-8(源文件还+BOM)。
2012年07月20日 08点07分
@幻の上帝 cmd残疾非得ANSI+GBK没办法,手动转码吧……
2012年07月20日 08点07分
level 15
宽字符只是储存宽字符集的实现形式而已。
wchar_t在Windows下2字节,只够放UCS2的Unicode BMP(基本多文种平面)字符的编码点。超过的部分(U+10000到U+10FFFF)没办法以一个宽字符表示。UTF-16使用的代理对(surrogate pair)就得用两个wchar_t。可以看出UCS-2在这里是定长编码,UTF-16是变长编码。
wchar_t在其它平台上通常是4个字节,可以放得下所有Unicode字符,使用UTF-32/UCS-4编码。宽字符最大的缺点之一是无法兼容窄字符,'\0'等按字节读取会造成很大麻烦,这样不得不需要不同的API处理字符串。加上4个字节实在浪费,*NIX普遍使用兼容ASCII的UTF-8代替宽字符编码。UTF-8是1-4字节的变长Unicode编码(旧版本是1-6字节,新的第三版RFC3629限制编码点上限到U+10FFFF)。这样原来使用的字符串函数可以不用改变(但意义可能不直观,像strlen的意义变成求字符串中编码点的总长度而非总字符数)。

2012年07月20日 08点07分 7
感谢上帝帮忙科普[傻笑]
2012年07月20日 08点07分
level 11
gameloftyou 楼主
怎么会不行呢
#include <iostream>
#include <cstdlib>
using namespace
std;
int main()
{
setlocale(LC_ALL,"chs");
wchar_t
text[] = L"中";
wcout<<text;
system("pause");
return
0;
}
把上面代码存为utf-8编码文件wchar_t.cpp放到c盘根目录下
然后控制台

2012年07月20日 10点07分 10
错了,应该用这个:g++ -fexec-charset=GBK wchar_t.cpp
2012年07月20日 10点07分
[啊!] 纳尼 直接用g++? 我一直不知道的说
2012年07月20日 15点07分
@巫洛雨 整理了下,看这个吧。https://tieba.baidu.com/p/1737948397
2012年07月20日 15点07分
level 7
反正我现在在vc++2010下写程序时大多都用的是unicode
2012年07月20日 14点07分 11
1