2007-09-01
ANSI和Unicode练习
关键字: Unicode windows ANSI W A每个使用C或者C++直到D的人都要认识到的Unicode问题:
如果你的程序要在更广的国度使用,或者要进入Internet,你都要使用Unicode!
先列个提纲,细节解释待续!
1.编码 ansi,mbcs/dbcs,unicode,ucs2
2.类型 ansi char ,utf8 char,wchar,dchar
3.类型的指针和内存复制
4.windows的知识
windwos98,2000,windowsCE
D代码
- public import std.c.string;
- public import std.string;
- public import std.utf;
- //win32
- import win32.windows;
- template zstr(T)
- {
- T[] zstr(T[] chars)
- {
- uint l = chars.length;
- chars.length = l + 1;
- chars[l] = 0;
- return chars;
- }
- }
- char[] w2a( wchar[] w ) { return toUTF8(w); }
- char[] w2az( wchar[] w ) { return zstr!(char)(w2a(w)); }
- char[] wz2a( wchar* w ) { return toUTF8( wz2w(w) ); }
- char[] wz2az( wchar* w ) { return zstr!(char)(wz2a(w)); }
- wchar[] a2w( char[] a ) { return toUTF16(a); }
- wchar[] a2wz( char[] a ) { return zstr!(wchar)(a2w(a)); }
- wchar[] az2w( char* a ) { return toUTF16( az2a(a) ); }
- wchar[] az2wz( char* a ) { return zstr!(wchar)(az2w(a)); }
- wchar[] wz2w( wchar* w ) { return w? w[0..wcslen(w)]: null; }
- char[] az2a( char* a ) { return a? a[0..strlen(a)]: null; }
- wchar[] w2wz( wchar[] w ) { return zstr!(wchar)(w); }
- char[] a2az( char[] a ) { return zstr!(char)(a); }
- const uint CP_ACP = 0; /* default to ANSI code page */
- const uint CP_OEMCP = 1; /* default to OEM code page */
- // wchar[] to multibyte string, zero terminated
- char[] wcs2mbz(wchar[] ws)
- {
- uint codepage = CP_OEMCP; //2000/+
- char[] rz;
- rz.length = WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, null, 0, null, null) + 1;
- WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, rz.ptr, rz.length, null, null);
- rz[rz.length-1] = 0;
- rz.length = rz.length-1;
- return rz;
- }
- // multibyte string to wide string
- wchar[] mbz2wcs(char[] s)
- {
- uint codepage = CP_OEMCP; //2000/+
- wchar[] rz;
- rz.length = MultiByteToWideChar(codepage, 0, s.ptr, s.length, null, 0) + 1;
- MultiByteToWideChar(codepage, 0, s.ptr, s.length, rz.ptr, rz.length);
- rz[rz.length-1] = 0;
- rz.length = rz.length-1;
- return rz;
- }
- void main()
- {
- char[] ctext,ccaption;
- wchar[] wtext,wcaption;
- wcaption="中文软件a1A";
- ccaption="中文软件a1A";
- wtext="1.unicode的windows函数 调用宽字符:直接转换为0结尾的字符串,";
- MessageBoxW(null, w2wz(wtext).ptr, w2wz(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- ctext="2.unicode的windows函数 调用普通字符:转换utf16的0结尾的字符串,";
- MessageBoxW(null, a2wz(ctext).ptr, a2wz(ccaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- wtext="3.ANSI的windows函数 调用宽字符:转换为toUTF8的0结尾的字符串,标题乱码,";
- MessageBoxA(null, wcs2mbz(wtext).ptr, w2az(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- wtext="4.ANSI的windows函数 调用宽字符:用WideCharToMultiByte转换为0结尾的ANSI字符串,";
- MessageBoxA(null, wcs2mbz(wtext).ptr, wcs2mbz(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- ctext="5.ANSI的windows函数 调用普通字符:用WideCharToMultiByte转换为0结尾的ANSI字符串,标题乱码.";
- //// convert UTF-8 to MBCS
- MessageBoxA(null, wcs2mbz(a2w(ctext)).ptr, a2az(ccaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- }
- /*
- 1.调用ANSI函数
- 2.调用Unicode函数
- 3.函数返回值,分配内存:
- 4.调用要使用字符数量:chars.sizeof/wchar.sizeof =chars.length
- */
评论
oldrev
2007-09-03
用单元测试来保证质量,D的风险应该不算大
redsea
2007-09-03
>BTW:现在用D来进行实际开发,似乎太过于冒险了吧。
不再弄 g++ 了, 编译时间都是浪费生命.
反正现在写的程序有 process monitor, 一旦工作不正常, 就杀掉重启, 问题不大.
不再弄 g++ 了, 编译时间都是浪费生命.
反正现在写的程序有 process monitor, 一旦工作不正常, 就杀掉重启, 问题不大.
Colorful
2007-09-03
BTW:现在用D来进行实际开发,似乎太过于冒险了吧。
Colorful
2007-09-02
@redsea
简单的说,在D 2.0中string的出现,对char[]的使用影响极大。
对于字符串常量来说,几乎没有了char[]的用武之地。
对于char[] str1 = "A"等之类的用法被完全拒绝。
在D 2.0中char[]跟其他类型动态数组的使用一致起来。
如果你对D语言数组的内存分配方式很了解的话,这些都不是问题。
麻烦的是那一大堆编译器错误的处理。
如果不了解其内存分配方式,建议还是统一使用string来的方便和安全。
如果要兼容D 1.0,可以使用version(...)来处理。
比如
简单的说,在D 2.0中string的出现,对char[]的使用影响极大。
对于字符串常量来说,几乎没有了char[]的用武之地。
对于char[] str1 = "A"等之类的用法被完全拒绝。
在D 2.0中char[]跟其他类型动态数组的使用一致起来。
如果你对D语言数组的内存分配方式很了解的话,这些都不是问题。
麻烦的是那一大堆编译器错误的处理。
如果不了解其内存分配方式,建议还是统一使用string来的方便和安全。
如果要兼容D 1.0,可以使用version(...)来处理。
比如
version(1.0)
{
alias char[] String; //String是临时起的
}
else
{
alias string String;
}
redsea
2007-09-02
to: Colorful
你直接告诉我吧 :)
我通过 dsss 使用 dmd 1.018 和 tango, D2.0 和 phobos 都没有研究.
我现在是将 D 用在实际开发中了.
你直接告诉我吧 :)
我通过 dsss 使用 dmd 1.018 和 tango, D2.0 和 phobos 都没有研究.
我现在是将 D 用在实际开发中了.
Colorful
2007-09-01
@redsea
你可以试验一下下面的代码:
你可以试验一下下面的代码:
import std.stdio;
void main()
{
char[1] a = "A";
writefln(a.ptr);
char[] b = a;
writefln(b.ptr);
string c = a;
writefln(c.ptr);
writefln();
string d = "B";
writefln(d.ptr);
string e = d;
writefln(e.ptr);
char[1] f= d;
writefln(f.ptr);
}
redsea
2007-09-01
D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
那不影响我们直接用 char[] 吧 ?
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
那不影响我们直接用 char[] 吧 ?
oldrev
2007-09-01
2.0的 constness 这个比 C++ 的还要复杂。
D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
ideage
2007-09-01
还没有有用过2.0呢,
Colorful
2007-09-01
郁闷,上面的代码不能在D 2.0下通过编译。
char[] -> string
wchar[] -> wstring
要修改的地方太多了,懒得改了,呵呵。
char[] -> string
wchar[] -> wstring
要修改的地方太多了,懒得改了,呵呵。
ideage
2007-09-01
引用
其实没这么复杂,D程序内部全用UTF-8,与 Windows API 交互时 toUTF16,*nix 系统基本上都完全支持UTF-8。
举双手赞成!
应该建议所有的D开发者,使用unicode,可惜DFL还想支持win9x。
Colorful
2007-09-01
比如Windows CE直接放弃了以A结尾的API。
Unicode是王道。
:)
Unicode是王道。
:)
Colorful
2007-09-01
MBCS的确应该淘汰了,Win9x也太古老了,呵呵。
Colorful
2007-09-01
我觉得把char类型直接改成16位的Unicode字符就很好,呵呵。
我如果使用D来开发,就完全采用wstring,只有在必要时,比如网络传输,才使用UTF8编码,因为这个时候很少使用除英文之外的其他语言。
可惜的是,Object,Exception等都采用的string.当要给系统API传递时,还要进行转换。
我如果使用D来开发,就完全采用wstring,只有在必要时,比如网络传输,才使用UTF8编码,因为这个时候很少使用除英文之外的其他语言。
可惜的是,Object,Exception等都采用的string.当要给系统API传递时,还要进行转换。
sofire
2007-09-01
在Linux,不知道能不能通过 环境变量,输出UTF8或者GB2312?
oldrev
2007-09-01
其实没这么复杂,D程序内部全用UTF-8,与 Windows API 交互时 toUTF16,*nix 系统基本上都完全支持UTF-8。需要实现快速的字符处理时转换为dchar。
至于其他什么 MBCS 之类就不用考虑了,现在已经没必要支持 Win9x。
至于其他什么 MBCS 之类就不用考虑了,现在已经没必要支持 Win9x。
发表评论
- 浏览: 112855 次

- 详细资料
搜索本博客
最新评论
-
ANSI和Unicode练习后记
要在dfl的listview控件里显示来自mysql的中文字符。 怎么出错了,提 ...
-- by wandernet -
D语言设计模式 Observer
好文!学习
-- by hqs7636 -
ANSI和Unicode练习后记
新年快乐!
-- by oldrev -
ANSI和Unicode练习后记
支持一个!新年快乐!
-- by DavidL -
D语言的IOCP(完成端口) ...
"iocp的使用例子(哪怕是C方式的)在dsource上都找不到一个,仅此一条i ...
-- by ahadf






评论排行榜