分享

关于C语言的中文字符串

 心不留意外尘 2016-04-28

http://blog.sina.com.cn/s/blog_7dc29ca00100uh53.html

2011.05

首先中文编码是4个字节,相当于四个字符。
所以你要放的话,可以这样。
char a[] = {"你好"};
printf("%s",a);

还可以以下方式存放:
char a[]="张三";
char b[]="李四";

中文数组一般是Unicode编码

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string ss1[2];
ss1[0] = "张三";
ss1[1] = "李四";
cout<<ss1[0]<<endl;
return 0;
}

-------------------------------------------------------------------------------------------

wchar_t是C/C++的字符数据类型,就是unicode编码,char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。

  wchar_t数据类型一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位[1],总之,wchar_t所能表示的字符数远超char型。

  标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。

  #include <iostream>

  #include <stdlib>

  using namespace std;

  void main()

  {

  locale loc( "chs" );//定义“区域设置”为中文方式

  wcout.imbue( loc );//载入中文字符输入方式

  wchar_t str[]=L"中国";//定义宽字符数组,注意L是大写

  wcout<<str<<endl;//显示宽字符数组,下同

  wprintf(str);

  system("pause");

  }

-----------------------------------------------------------------------------------------

    wchar_t是C/C++的字符数据类型,就是unicode编码,char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。

  wchar_t数据类型一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位[1],总之,wchar_t所能表示的字符数远超char型。

  标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。 #include <iostream>

  #include <stdlib>

  using namespace std;

  void main()

  {

  locale loc( "chs" );//定义“区域设置”为中文方式

  wcout.imbue( loc );//载入中文字符输入方式

  wchar_t str[]=L"中国";//定义宽字符数组,注意L是大写

  wcout<<str<<endl;//显示宽字符数组,下同

  wprintf(str);

  system("pause");

  } 

------------------------------------------------------------------------------------------

UNICODE   编程入门
作者:NorthTibet


简介

        如果你编写的程序是针对非英语国家的用户,如中国、日本、东欧和中东地区,那么你一定要熟悉   UNICODE   字符集。尤其是用   Visual   C++/MFC   编写针对上述国家和地区的用户的程序时,如果你想让自己的应用程序得到更广泛的用户,那么必须考虑代码   UNICODE   的兼容性,也就是说它既在   ASCII   模式下运行   ,也能在UNICODE   模式下运行。本文将介绍   UNICODE   的一些基本编程知识,澄清很多人(包括我自己)在这个问题上存在的模糊认识。对于任何使用   Visual   C++   和/或   MFC   编程的人来说,这篇文章肯定值得一读。

UNICODE到底是什么?

        UNICODE   是目前用来解决   ASCII   码   256   个字符限制问题的一种比较流行的解决方案。大家知道,ASCII   字符集只有256个字符,用   0-255   之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。有些超过千个。人们为了突破   ASCII   码字符数的限制,试图用一种简单的方法来针对超过256个字符的语言编写计算机程序。于是   UNICODE   应运而生。UNICODE   通过用双字节来表示一个字符,从而在更大范围内将数字代码映射到多种语言的字符集。

Visual   C++的解决方案  

        作为软件开发人员,如何熟练有效地使用   UNICODE   呢?如果你正在用   Visual   C++   编写程序,UNICODE   兼容性意味着你的程序是否具有国际化特征,也就是说你的应用程序是针对本地市场还是国际市场。一旦你作出了决定,那么就得在代码中实现具体细节。好在   Visual   C++   提供了很多内建功能来支持   UNICODE,在创建工程时就可以利用   Visual   C++   提供的这些功能。在产生应用程序框架代码之前,AppWizard   允许开发人员决定是否支持   UNICODE。Win32   SDK   包含有一些数据类型遵循   UNICODE   编码规则,MFC   以宏的形式提供了将一般文本转换成   UNICODE   数据类型的途径。开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持   UNICODE   的应用。

字符串  

        C   程序员一般是用   char   关键字象下面这样来声明一个字符串数组:                 char   str[100];              
象下面这样声明函数原形:                 void   strcpy(   char   *out,   char   *in   );                

为了将上面的声明改成支持双字节的   UNICODE   字符集,可以用下面的方法:

              wchar_t   str[100];                
或者
              void   wcscpy(   wchar_t   *out,   wchar_t   *in   );                
        此外,微软还提供一种通过预处理指令来实现   UNICODE。每当用   Visual   C++   创建新工程时,只要确定是否支持另外一种字符集,则   AppWizard   将会在头文件中插入预处理指令。这些指令告诉编译器程序想要支持何种字符集。这样在使用VC++提供的通用数据类型时,编译器将用相应的数据类型把通用数据类型替换成所需要支持的字符集。这样很容易将代码重新编译成支持其它字符集的程序。
        为了在   Visual   C++   6.0   中激活   UNICODE   标准,可以这样做:打开工程文件后,从主菜单中选择“Project   |   Settings”打开工程设置对话框   =>   然后选择“C/C++”标签   =>   在“Preprocessor   definitions”编辑框中添加   UNICODE   或者   _UNICODE   预处理宏指令。如图一所示:
注意这里的   UNICODE   和   _UNICODE   有什么区别呢?前者没有下划线,专门用于   Windows   头文件;后者有一个前缀下划线,专门用于   C   运行时头文件。
在代码中,凡是用关键字   char     的地方都用   TCHAR   取代;凡是用   char   *   的地方都用   LPTSTR   取代;凡是定义在双引号中的字符串常量(如 "VCKBASE   Online   Journal ")都用   TEXT   宏重写:  

              TEXT( "VCKBASE   Online   Journal ");              
TEXT   宏的主要作用是当定义了   UNICODE/_UNICODE   预处理指令时,字符串被标志为双字节字符串,否则字符串被标示为   ANSI   字符串。TEXT   的定义如下:  
            TEXT(
                      LPTSTR   string   //   ANSI   或者   Unicode   字符串
            );
            参数       string   为字符串指针,指向被解释的   Unicode   或者   ANSI   字符串
在文档中   微软提供了包括通用类型在内的几种数据类型都与   ASCII   和   UNICODE兼容。这一点可以参考微软在线文档有关“通用数据类型和数据类型”的章节。

例子代码

下面通过一些简单的例子来进一步探讨   UNICODE   编程。

使用   ASCII   字符集的“Hello,   World”:

//*********************************
//   用   MFC   实现的 "Hello   World! "   代码
//*********************************

//hello.cpp

#include   <afxwin.h>

//   Declare   the   application   class
class   CHelloApp   :   public   CWinApp
{
public:
      virtual   BOOL   InitInstance();
};

//   Create   an   instance   of   the   application   class
CHelloApp   HelloApp;
 
//   Declare   the   main   window   class
class   CHelloWindow   :   public   CFrameWnd
{
      CStatic*   cs;
public:
      CHelloWindow();
};

//   The   InitInstance   function   is   called   each
//   time   the   application   first   executes.
BOOL   CHelloApp::InitInstance()
{
      m_pMainWnd   =   new   CHelloWindow();
      m_pMainWnd-> ShowWindow(m_nCmdShow);
      m_pMainWnd-> UpdateWindow();
      return   TRUE;
}

//   The   constructor   for   the   window   class
CHelloWindow::CHelloWindow()
{
      //   Create   the   window   itself
      Create(NULL,   "Hello   World! ",   WS_OVERLAPPEDWINDOW,  
                    CRect(0,0,200,200));  

      //   Create   a   static   label
      cs   =   new   CStatic();
      cs-> Create( "hello   world ",   WS_CHILD|WS_VISIBLE|SS_CENTER,  
                            CRect(50,80,150,150),   this);
}

修改上面的代码使之支持   UNICODE   字符集,串常量必须要改成对应的   UNICODE   字符。方法是对串常量使用TEXT   宏。这个宏将告诉预处理器检查使用什么样的字符标准:

//   The   constructor   for   the   window   class
CHelloWindow::CHelloWindow()
{
      //   Create   the   window   itself
      Create(NULL,   TEXT( "Hello   World! "),   WS_OVERLAPPEDWINDOW,  
                    CRect(0,0,200,200));

      //   Create   a   static   label
      cs   =   new   CStatic();
      cs-> Create(   TEXT( "hello   world! "),   WS_CHILD|WS_VISIBLE|SS_CENTER,  
                            CRect(50,80,150,150),   this);
}
当预处理器碰到通用数据类型,它便检查   AFXWIN.H   头文件的   _UNICODE   定义。然后根据   UNICODE   定义插入相应的的数据类型。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多