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.  */  

你可能感兴趣的:(C++,c,windows,C#,D语言)