CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

关于unicode 的问题,~~

楼主arlalei(小溪)2004-08-03 19:15:39 在 C/C++ / C语言 提问

各位大虾,谁能给我讲一下,   如何   使用   unicode   开发程序~? 问题点数:50、回复次数:4Top

1 楼BroncoSpeedCoursing(≡野马奔驰≡)回复于 2004-08-03 19:44:11 得分 50

Unicode   :宽字节字符集  
   
  1.   如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?  
  可以调用Microsoft   Visual   C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。  
  调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。  
   
  2.   如何对DBCS(双字节字符集)字符串进行操作?  
  函数   描述  
  PTSTR   CharNext   (   LPCTSTR   );   返回字符串中下一个字符的地址  
  PTSTR   CharPrev   (   LPCTSTR,   LPCTSTR   );   返回字符串中上一个字符的地址  
  BOOL   IsDBCSLeadByte(   BYTE   );   如果该字节是DBCS字符的第一个字节,则返回非0值  
   
  3.   为什么要使用Unicode?  
  (1)   可以很容易地在不同语言之间进行数据交换。  
  (2)   使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。  
  (3)   提高应用程序的运行效率。  
  Windows   2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。  
  Windows   CE   本身就是使用Unicode的一种操作系统,完全不支持ANSI   Windows函数  
  Windows   98   只支持ANSI,只能为ANSI开发应用程序。  
  Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。  
   
  4.   如何编写Unicode源代码?  
  Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。  
  _UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。  
   
  5.   Windows定义的Unicode数据类型有哪些?  
  数据类型   说明  
  WCHAR   Unicode字符  
  PWSTR   指向Unicode字符串的指针  
  PCWSTR   指向一个恒定的Unicode字符串的指针  
  对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。  
  ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。  
   
  6.   如何对Unicode进行操作?  
  字符集   特性   实例  
  ANSI   操作函数以str开头   strcpy  
  Unicode   操作函数以wcs开头   wcscpy  
  MBCS   操作函数以_mbs开头   _mbscpy  
  ANSI/Unicode   操作函数以_tcs开头   _tcscpy(C运行期库)  
  ANSI/Unicode   操作函数以lstr开头   lstrcpy(Windows函数)  
  所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:  
  #ifdef   UNICODE  
  #define   CreateWindowEx   CreateWindowExW  
  #else  
  #define   CreateWindowEx   CreateWindowExA  
  #endif   //   !UNICODE  
   
  7.   如何表示Unicode字符串常量?  
  字符集   实例  
  ANSI   “string”  
  Unicode   L“string”  
  ANSI/Unicode   T(“string”)或_TEXT(“string”)if(   szError[0]   ==   _TEXT(‘J’)   ){   }  
   
  8.   为什么应当尽量使用操作系统函数?  
  这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。  
  如:StrCat,StrChr,StrCmp和StrCpy等。  
   
  9.   如何编写符合ANSI和Unicode的应用程序?  
  (1)   将文本串视为字符数组,而不是chars数组或字节数组。  
  (2)   将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。  
  (3)   将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。  
  (4)   将TEXT宏用于原义字符和字符串。  
  (5)   执行全局性替换(例如用PTSTR替换PSTR)。  
  (6)   修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用  
  malloc(nCharacters   *sizeof(TCHAR)),而不是调用malloc(nCharacters)。  
   
  10.   如何对字符串进行有选择的比较?  
  通过调用CompareString来实现。  
  标志   含义  
  NORM_IGNORECASE   忽略字母的大小写  
  NORM_IGNOREKANATYPE   不区分平假名与片假名字符  
  NORM_IGNORENONSPACE   忽略无间隔字符  
  NORM_IGNORESYMBOLS   忽略符号  
  NORM_IGNOREWIDTH   不区分单字节字符与作为双字节字符的同一个字符  
  SORT_STRINGSORT   将标点符号作为普通符号来处理  
   
  11.   如何判断一个文本文件是ANSI还是Unicode?  
  判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。  
   
  12.   如何判断一段字符串是ANSI还是Unicode?  
  用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此   IsTextUnicode有可能返回不正确的结果。  
   
  13.   如何在Unicode与ANSI之间转换字符串?  
  Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。  
   
  Top

2 楼UPCC(杂食动物)回复于 2004-08-03 19:52:04 得分 0

unicode对应的宏(UNICODE)然后    
  WCHAR   d=   L'i';//存放两个字节!Top

3 楼arlalei(小溪)回复于 2004-08-03 19:57:45 得分 0

3x   a   lotTop

4 楼BroncoSpeedCoursing(≡野马奔驰≡)回复于 2004-08-03 20:08:30 得分 0

作爲一個電腦的多位元組字元表示系統,Unicode   支援世界上所有語言的編碼和轉換。這篇文章說明了   Linux   應用程式中的國際語言支援的重要性,以及設計   Unicode   支援並將之結合到   Linux   應用程式中去的思想。    
   
    Unicode   並不只是一個編程工具,它還是一個政治的、經濟的工具。沒有結合世界的語言支援的應用程式通常只能被那些能讀寫   ASCII   所支援語言的個人使用。這使得建立在   ASCII   基礎之上的電腦技術脫離了世界上大部分人。Unicode   允許程式使用世界上任何一種字元集,因此它支援所有語言。  
   
    Unicode   讓程式師爲普通人提供用他們本國語言就能使用的軟體。這樣就不用再學一門外語了,而且更容易實現電腦技術社會和財政上的利益。很容易設想,如果用戶必須爲使用因特網瀏覽器而學習烏爾都語的話,您就難以看到電腦在美國的使用。Web   就更不會出現了。  
   
    Linux   承擔了對   Unicode   很大程度上的支援。Unicode   支援被嵌入到內核和代碼開發庫中。在很大程度上,使用程式中幾句簡單的命令就能將它們自動的結合到代碼中。  
   
    所有現代字元集的基礎都是在   1968   年以   ANSIX3.4   版本出版的美國資訊交換標準碼(American   Standard   Code   for   Information   Interchange,ASCII)。一個值得注意的例外是在   ASCII   之前定義的   IBM   的擴充的二進位編碼的十進位交換碼(Extended   Binary   Coded   Decimal   Information   Code,EBCDIC)。ASCII   是一個編碼字元集(coded   character   set,CCS),換句話說,它是整數到字元表示的映射。ASCII   編碼字元集允許用一個八位元(基於二進位的,用值   0   或   1   表示的)欄位或位元組(2^8   =256)表示   256   個字元。這是一個高度受限的編碼字元集,它不能表示許多不同語言的所有字元(如中文和日文),不能表示科學符號,更不能表示古代文字(神秘符號和象形文字)和音樂符號。通過更改一個位元組的長度而使更大的字元集得以被編碼,這似乎有效但完全不切實際。所有的電腦都基於八位元位元組。解決方法是一種字元編碼方案(Character   encoding   scheme,CES)—   用定長或變長的多位元組序列能夠表示比   256   大的數.這些數值接著通過編碼字元集被映射到它們表示的字元。  
   
  Unicode   的定義  
   
    Unicode   通常用作涉及雙位元組字元編碼方案的通用術語。Unicode   CCS   3.1   的官方稱謂是   ISO10646-1   通用多八位元組編碼字元集(Universal   Multiple   Octet   Coded   Character   Set,UCS)。Unicode   3.1   版本添加了   44,946   個新的編碼字元。算上   Unicode   3.0   版本已經存在的   49,194   個字元,共計   94,140   個。  
   
    Unicode   編碼字元集利用了一個由   128   個三維的組構成的四維編碼空間。其中每個組包含   256   個二維平面。每個平面由   256   個一維的行組成,並且每個行有   256   個單元。每個單元在這個編碼空間內對一個字元編碼,或者被聲明爲未經使用。這種編碼概念被稱爲   UCS-4;四個八位元用來表示指定組、平面、行和單元的每個字元。  
   
    第一個平面(第   00   組的第   00   平面)是基本多語言平面(Basic   Multilingual   Plane,BMP)。BMP   按字母、音節、表意符號和各種符號及數位定義了常規使用的字元。後續的平面用於附加字元或其他還沒有發明的編碼實體。我們需要這完整的範圍去處理世界上的所有語言;特別是擁有將近   64,000   個字元的一些東亞語言。  
   
    BMP   被用作雙位元組的編碼字元集,這種編碼字元集確定爲   ISO   10646   UCS-2   格式。ISO   10646   UCS-2   就是指   Unicode(並且兩者相同)。BMP,像所有   UCS   平面那樣,包含了   256   行,其中每行包含   256   個單元,字元僅僅按照   BMP   中的行和單元的八位元元在單元中被編碼。這就允許   16   位元編碼字元能夠被用來書寫大多數商業上最重要的語言。UCS-2   不需要內碼表切換、代碼擴展或代碼狀態。UCS-2   是一種將   Unicode   結合到軟體中的簡單方法,但它只限於支援   Unicode   BMP。  
   
    若要用   8   位元位元組表示一個多於   2^8   =256   個字元的字元編碼系統(character   coding   system,CCS),就需要一種字元編碼方案(character-encoding   scheme,CES)。  
   
  Unicode   轉換  
   
    在   UNIX   中,使用得最多的字元編碼方案是   UTF-8。它考慮到了對整個   Unicode   全部頁和平面的全面支援,而且它仍能正確的識別   ASCII。除了   UTF-8   的其他選擇還有:UCS-4、UTF-16、UTF-7.5、UTF-7、SCSU、HTML   和   JAVA。  
   
    Unicode   轉換格式(Unicode   Transformation   Formats,UTFs)是一種通過映射多位元組編碼中的值來支援   Unicode   的字元編碼方案。本文將分析最流行的格式   —   UTF-8   字元編碼系統。  
   
  UTF-8  
   
    UTF-8   轉換格式正逐步成爲一種占主導地位的交換國際文本資訊的方法,因爲它可以支援世界上所有的語言,而且它還與   ASCII   相容。UTF-8   使用變長編碼。從   0   到   0x7f(127)的字元把自身編碼成單字節,而將值更大的字元編碼成   2   到   6   個位元組。  
   
  Top

相关问题

  • _UNICODE
  • unicode <->shiftjis
  • 关于Unicode
  • UNICODE和WinMain
  • 又是unicode
  • Unicode问题!
  • how to change Unicode to SJIS?
  • 关于UNICODE
  • unicode-->wideString 求助?
  • unicode 是什么

关键词

  • 函数
  • unicode
  • 字符
  • 平面
  • 应用程序
  • 转换
  • 字符集
  • 映射
  • 数据
  • 操作系统

得分解答快速导航

  • 帖主:arlalei
  • BroncoSpeedCoursing

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo