python 中文 str 以及 unicode区别和互相转换

看了 http://www.jianshu.com/p/53bb448fe85b# 这篇兄弟的文章, 深有感触,自己做做测试试试:

  • 加不加u是有区别的哦
    这里写图片描述

  • unicode到string 只需要encode一下,尤其在我们读取unicode的文本,然后需要进行字符拼接的时候,本身unicode无法进行拼接
    这里写图片描述

  • string decode之后就是unicode了
    这里写图片描述

  • string和string, 以及 unicode和unicode 可以进行拼接

这里写图片描述

这里写图片描述

  • 但是string和unicode在一起就有问题了

这里写图片描述


In [38]: 

In [38]: 

In [38]: a1 + b1
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-38-ffd3f356020c> in <module>()
----> 1 a1 + b1

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

我们该怎么办呢

In [39]: a1.decode('utf-8') + b1
Out[39]: u'\u5927\u4e2d'

In [40]: 

In [40]: 

In [40]: a1 + b1.encode("utf-8")
Out[40]: '\xe5\xa4\xa7\xe4\xb8\xad'

这里写图片描述

### 将Unicode编码转换为字符的方法 在编程中,可以使用多种方式将Unicode编码转换回对应的字符。以下是几种常见语言中的实现方法。 #### JavaScript 实现 在JavaScript中,可以通过`String.fromCharCode()`函数来完成这一操作。此函数接受一系列整数作为参数,并返回这些整数所代表的Unicode字符组成的字符串[^1]。 ```javascript const unicodeValues = [0x4F60, 0x597D, 0xFF0C, 0x4E16, 0x754C, 0xFF01]; // Unicode码点数组 const result = String.fromCharCode(...unicodeValues); // 使用扩展运算符传入数组 console.log(result); // 输出:你好,世界! ``` #### Python 实现 Python提供了内置的支持用于处理Unicode字符串。可以直接利用反斜杠`\u`加上四位十六进制数或者`\U`加上八位十六进制数表示单个Unicode字符[^2]。 ```python unicode_string = "\\u4F60\\u597D\\uFF0C\\u4E16\\u754C\\uFF01" decoded_string = bytes(unicode_string, 'utf-8').decode('unicode_escape') print(decoded_string) # 输出:你好,世界! ``` 另一种更直观的方式是在列表里定义好所有的Unicode数值再逐一拼接: ```python code_points = [0x4F60, 0x597D, 0xFF0C, 0x4E16, 0x754C, 0xFF01] result = ''.join(chr(i) for i in code_points) print(result) # 输出:你好,世界! ``` #### C++ 实现 (Windows API) 对于C/C++开发者来说,在Windows平台上可借助于WinAPI里的两个重要函数——`MultiByteToWideChar` `WideCharToMultiByte` 来互相转化ANSI与UTF-16LE格式之间的数据流[^3]。下面展示的是从宽字节串恢复到多字节串的过程。 ```cpp #include <windows.h> #include <iostream> int main(){ const wchar_t* wstr = L"\u4F60\u597D\uFF0C\u4E16\u754C\uFF01"; // 定义一个包含Unicode字符的宽字符串 int size_needed = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, FALSE); std::string str_to(size_needed, '\0'); WideCharToMultiByte(CP_UTF8, 0, wstr, -1, &str_to[0], size_needed, NULL, FALSE); printf("%s\n", str_to.c_str()); // 打印结果应该是 UTF-8 编码形式下的 “你好,世界!” } ``` 以上展示了不同编程环境下如何把存储着Unicode编码的数据还原成实际可见的文字内容的技术手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值