C++中汉字与unicode码的转换

         已知一个汉字的unicode码(例如-20319),可以通过以下方法得到该unicode码对应的汉字:

        1,声明一个3字节长的字符数组,例如char a[3];

        2,对该数组赋值为char a[3]={unsigned(-20319)/256,unsigned(-20319)%256,0};

        3,输出直接为cout<<a<<endl;即可;

        4,也可以把字符数组直接赋值给字符串string,例如string str(a);。

        下面对步骤2进行解释,unicode码为16位(unsigned short),而字符char类型仅有8位,步骤2完成的功能就是把unicode前8位和后8位分别存放在一个字符数组不同的2字节中,由此可以想像,char型的字符串存储汉字时也应该是这样的。结尾的0表示数组的结束。

        查一个汉字的unicode码更简单,声明一个wchar_t变量,并直接赋值一个汉字,例如wchar_t ch='阿';,显示时直接cout<<ch<<endl;即可。不过编译时可能给警告。输出的文件中和普通操作一样。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的 C++ 算法,用于将 GB18030 编转换Unicode: ```c++ #include <iostream> #include <string> #include <vector> typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; // GB18030 编转换Unicode std::wstring GB18030ToUnicode(const std::string& str) { std::wstring result; std::vector<BYTE> bytes(str.begin(), str.end()); int i = 0; while (i < bytes.size()) { if (bytes[i] <= 0x7F) { // ASCII 字符 result += (wchar_t)bytes[i]; i++; } else if (bytes[i] >= 0x81 && bytes[i] <= 0xFE) { // 双字节字符 if (i + 1 < bytes.size()) { WORD w = ((WORD)bytes[i] << 8) | ((WORD)bytes[i + 1]); if (w >= 0x8140 && w <= 0xFEFE && w != 0x817F && w != 0x8180) { // GBK/GB2312 编范围内的汉字 result += (wchar_t)(0x4E00 + (w - 0x8140) / 0x100 * 0x40 + (w - 0x8140) % 0x100); } else if (w >= 0x8130 && w <= 0xA0FE) { // GB18030 编范围内的汉字 DWORD dw = ((DWORD)w - 0x8130) / 10 * 0x100 + ((DWORD)w - 0x8130) % 10 + 0x10000; result += (wchar_t)dw; } i += 2; } else { break; } } else if (bytes[i] >= 0x80 && bytes[i] <= 0xBF) { // 单字节字符,不是汉字 result += (wchar_t)bytes[i]; i++; } else if (bytes[i] >= 0xC0 && bytes[i] <= 0xDF) { // 双字节字符,不是汉字 if (i + 1 < bytes.size()) { WORD w = ((WORD)bytes[i] << 8) | ((WORD)bytes[i + 1]); result += (wchar_t)(0x80 + (w - 0xC0A0)); i += 2; } else { break; } } else if (bytes[i] >= 0xE0 && bytes[i] <= 0xEF) { // 三字节字符 if (i + 2 < bytes.size()) { DWORD dw = ((DWORD)bytes[i] << 16) | ((DWORD)bytes[i + 1] << 8) | (DWORD)bytes[i + 2]; result += (wchar_t)dw; i += 3; } else { break; } } else { break; } } return result; } ``` 下面是一个简单的 C++ 算法,用于将 Unicode转换成 GB18030 编: ```c++ #include <iostream> #include <string> #include <vector> typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; // Unicode转换成 GB18030 编 std::string UnicodeToGB18030(const std::wstring& str) { std::string result; for (int i = 0; i < str.size(); i++) { if (str[i] <= 0x7F) { // ASCII 字符 result += (char)str[i]; } else if (str[i] >= 0x4E00 && str[i] <= 0x9FA5) { // GBK/GB2312 编范围内的汉字 BYTE b1 = (BYTE)((str[i] - 0x4E00) / 0x40 + 0x81); BYTE b2 = (BYTE)((str[i] - 0x4E00) % 0x40 + 0x40); result += b1; result += b2; } else { // GB18030 编范围内的汉字 DWORD dw = (DWORD)str[i]; if (dw >= 0x10000 && dw <= 0x10FFFF) { dw -= 0x10000; BYTE b1 = (BYTE)(dw / 0x1000 + 0x90); BYTE b2 = (BYTE)((dw % 0x1000) / 0x40 + 0x81); BYTE b3 = (BYTE)((dw % 0x1000) % 0x40 + 0x30); result += b1; result += b2; result += b3; } } } return result; } ``` 需要注意的是,这两个算法只是简单的示例代,不能处理所有情况。在实际应用,需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值