`
ideage
  • 浏览: 329468 次
社区版块
存档分类
最新评论

ANSI和Unicode练习

阅读更多

每个使用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代码
  1. public import std.c.string;   
  2. public import std.string;   
  3. public import std.utf;   
  4.   
  5. //win32   
  6. import win32.windows;   
  7.   
  8. template zstr(T)    
  9. {   
  10.   T[] zstr(T[] chars)    
  11.   {   
  12.     uint l = chars.length;   
  13.     chars.length = l + 1;   
  14.     chars[l] = 0;       
  15.     return chars;   
  16.   }   
  17. }   
  18.   
  19.   
  20. char[]  w2a( wchar[] w )  { return toUTF8(w); }   
  21. char[]  w2az( wchar[] w ) { return zstr!(char)(w2a(w)); }   
  22. char[]  wz2a( wchar* w )  { return toUTF8( wz2w(w) ); }   
  23. char[]  wz2az( wchar* w ) { return zstr!(char)(wz2a(w)); }   
  24.   
  25. wchar[] a2w( char[] a )  { return toUTF16(a); }   
  26. wchar[] a2wz( char[] a ) { return zstr!(wchar)(a2w(a)); }   
  27. wchar[] az2w( char* a )  { return toUTF16( az2a(a) ); }   
  28. wchar[] az2wz( char* a ) { return zstr!(wchar)(az2w(a)); }   
  29.   
  30. wchar[] wz2w( wchar* w ) { return w? w[0..wcslen(w)]: null; }   
  31. char[]  az2a( char* a ) { return a? a[0..strlen(a)]: null; }   
  32.   
  33. wchar[] w2wz( wchar[] w ) { return zstr!(wchar)(w); }   
  34. char[]  a2az( char[] a )   { return zstr!(char)(a); }   
  35.   
  36.   
  37. const uint CP_ACP  =  0;    /* default to ANSI code page */  
  38. const uint CP_OEMCP  = 1;  /* default to OEM  code page */  
  39.   
  40. // wchar[] to multibyte string, zero terminated   
  41. char[] wcs2mbz(wchar[] ws)   
  42. {   
  43.     uint codepage =  CP_OEMCP; //2000/+   
  44.     char[] rz;    
  45.     rz.length = WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, null, 0, nullnull) + 1;   
  46.     WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, rz.ptr, rz.length, nullnull);   
  47.     rz[rz.length-1] = 0;   
  48.     rz.length = rz.length-1;   
  49.     return rz;   
  50. }   
  51. // multibyte string to wide string   
  52. wchar[] mbz2wcs(char[] s)   
  53. {   
  54.     uint codepage =  CP_OEMCP; //2000/+   
  55.     wchar[] rz;    
  56.     rz.length = MultiByteToWideChar(codepage, 0, s.ptr, s.length, null, 0) + 1;   
  57.     MultiByteToWideChar(codepage, 0, s.ptr, s.length, rz.ptr, rz.length);   
  58.     rz[rz.length-1] = 0;   
  59.     rz.length = rz.length-1;   
  60.     return rz;   
  61. }   
  62.   
  63.  void main()    
  64.  {   
  65.     char[] ctext,ccaption;     
  66.     wchar[] wtext,wcaption;   
  67.        
  68.     wcaption="中文软件a1A";   
  69.     ccaption="中文软件a1A";   
  70.        
  71.     wtext="1.unicode的windows函数 调用宽字符:直接转换为0结尾的字符串,";   
  72.     MessageBoxW(null, w2wz(wtext).ptr, w2wz(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);    
  73.        
  74.     ctext="2.unicode的windows函数 调用普通字符:转换utf16的0结尾的字符串,";   
  75.     MessageBoxW(null, a2wz(ctext).ptr, a2wz(ccaption).ptr, MB_OK | MB_ICONEXCLAMATION);   
  76.        
  77.     wtext="3.ANSI的windows函数 调用宽字符:转换为toUTF8的0结尾的字符串,标题乱码,";   
  78.     MessageBoxA(null, wcs2mbz(wtext).ptr, w2az(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);   
  79.        
  80.     wtext="4.ANSI的windows函数 调用宽字符:用WideCharToMultiByte转换为0结尾的ANSI字符串,";   
  81.     MessageBoxA(null, wcs2mbz(wtext).ptr, wcs2mbz(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);   
  82.        
  83.     ctext="5.ANSI的windows函数 调用普通字符:用WideCharToMultiByte转换为0结尾的ANSI字符串,标题乱码.";   
  84.     //// convert UTF-8 to MBCS   
  85.     MessageBoxA(null, wcs2mbz(a2w(ctext)).ptr, a2az(ccaption).ptr, MB_OK | MB_ICONEXCLAMATION);    
  86.        
  87.  }   
  88.     
  89.  /*  
  90.  1.调用ANSI函数  
  91.  2.调用Unicode函数  
  92.    
  93.  3.函数返回值,分配内存:  
  94.  4.调用要使用字符数量:chars.sizeof/wchar.sizeof =chars.length  
  95.    
  96.  */  
分享到:
评论
16 楼 oldrev 2007-09-03  
用单元测试来保证质量,D的风险应该不算大
15 楼 redsea 2007-09-03  
>BTW:现在用D来进行实际开发,似乎太过于冒险了吧。
不再弄 g++ 了, 编译时间都是浪费生命.
反正现在写的程序有 process monitor, 一旦工作不正常, 就杀掉重启, 问题不大.

14 楼 Colorful 2007-09-03  
BTW:现在用D来进行实际开发,似乎太过于冒险了吧。
13 楼 Colorful 2007-09-02  
@redsea
简单的说,在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;
}
12 楼 redsea 2007-09-02  
to: Colorful

你直接告诉我吧

我通过 dsss 使用 dmd 1.018 和 tango, D2.0 和 phobos 都没有研究.

我现在是将 D 用在实际开发中了.
11 楼 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);
}
10 楼 redsea 2007-09-01  
D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。


那不影响我们直接用 char[] 吧 ?
9 楼 oldrev 2007-09-01  
2.0的 constness 这个比 C++ 的还要复杂。

D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
8 楼 ideage 2007-09-01  
还没有有用过2.0呢,
7 楼 Colorful 2007-09-01  
郁闷,上面的代码不能在D 2.0下通过编译。
char[] -> string
wchar[] -> wstring
要修改的地方太多了,懒得改了,呵呵。
6 楼 ideage 2007-09-01  
引用
其实没这么复杂,D程序内部全用UTF-8,与 Windows API 交互时 toUTF16,*nix 系统基本上都完全支持UTF-8。


举双手赞成!

应该建议所有的D开发者,使用unicode,可惜DFL还想支持win9x。
5 楼 Colorful 2007-09-01  
比如Windows CE直接放弃了以A结尾的API。

Unicode是王道。

:)
4 楼 Colorful 2007-09-01  
MBCS的确应该淘汰了,Win9x也太古老了,呵呵。
3 楼 Colorful 2007-09-01  
我觉得把char类型直接改成16位的Unicode字符就很好,呵呵。

我如果使用D来开发,就完全采用wstring,只有在必要时,比如网络传输,才使用UTF8编码,因为这个时候很少使用除英文之外的其他语言。

可惜的是,Object,Exception等都采用的string.当要给系统API传递时,还要进行转换。
2 楼 sofire 2007-09-01  
在Linux,不知道能不能通过 环境变量,输出UTF8或者GB2312?
1 楼 oldrev 2007-09-01  
其实没这么复杂,D程序内部全用UTF-8,与 Windows API 交互时 toUTF16,*nix 系统基本上都完全支持UTF-8。需要实现快速的字符处理时转换为dchar。
至于其他什么 MBCS 之类就不用考虑了,现在已经没必要支持 Win9x。

相关推荐

    sys_string_5.zip_unicode

    《Windows95/98环境下Unicode字符串处理技术详解》 在Windows操作系统中,字符串处理是一项基础且关键的任务,尤其在...通过实际的编程练习和对示例代码的分析,开发者可以深化对Unicode的理解,提升自己的编程技能。

    ImageInTerminal.jl:Julia包,用于在终端中使用ANSI颜色和Unicode字符显示图像

    **ImageInTerminal.jl** 是一个专为Julia编程语言设计的开源包,其主要功能是在终端中通过ANSI颜色编码和Unicode字符来显示图像。这个包的独特之处在于它允许用户在没有图形用户界面(GUI)的情况下,在命令行环境中...

    计算机基础知识和网络基础知识练习题.pdf

    - 编码方案的了解,如ANSI(美国国家标准协会)和Unicode编码。 5. 计算机技术发展史 - 早期计算机的制造商和模型,如ENIAC,UNIVAC-ID,IBM-7000系列。 6. 计算机外部设备 - 输入输出设备的基本知识,如键盘、...

    精品资料(2021-2022收藏)SQL Server基础查询练习(附答案).doc

    SQL Server支持多种数据类型,如`NUMERIC`(数值)、`NVARCHAR`(可变长度的Unicode字符串)、`DATETIME`(日期和时间)等。 7. **索引**: 虽然文档中没有直接提及,但通常在实际应用中,为了提高查询效率,会为...

    Notepad记事本

    5. **编码选择**:Notepad支持多种字符编码,如ANSI、UTF-8、Unicode和UTF-16,这使得它能处理不同语言和特殊字符集的文本。 6. **代码高亮**:虽然Notepad的功能相对基础,但它对一些常见编程语言的语法有简单的...

    MFC基础教程.doc

    MFC支持多种字符集,包括ANSI和Unicode等。 **1.4 用向导生成一个MFC应用程序** - **向导流程**:通过IDE中的向导,可以选择应用程序类型(如对话框基或文档/视图基)、设置项目名称和位置等。 - **类视图**:类...

    python爱心代码高级

    例如,我们可以引入ANSI转义序列来实现彩色输出,或者使用Unicode字符来绘制更细腻的心形图案。 当我们谈论“高级”时,可能还会涉及动画效果。例如,我们可以使用Python的`time`模块和`clear_output`函数来实现...

    实用Turbo C 教程

    本"实用Turbo C教程"将详细讲解Turbo C的使用方法,包括基本语法、控制结构、函数、指针、数组、结构体、文件操作等内容,并提供实例练习,帮助你快速掌握C语言编程基础。 九、实践与进阶 学习C语言的关键在于动手...

    记事本

    7. **教学用途**:记事本常用于初学者学习编程的基础练习,因为它是最基础的文本编辑工具,可以让学生专注于代码逻辑,而不是复杂的编辑器设置。 在“压缩包子文件的文件名称列表”中,只有一个名为“note”的文件...

Global site tag (gtag.js) - Google Analytics