当前位置: 首页 > news >正文

Pyhon 中文编码问题(字符串前加‘U’)

中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢?

我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各种编码,比如作为中国程序经常要面对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢?

首先我们先看一下源代码文件中使用字符串的情况。源代码文件作为文本文件就必然是以某种编码形式存储代码的,python默认会认为源代码文件是asci编码,比如说代码中有一个变量赋值:

s1=’a’ 
print s1

 

python认为这个’a’就是一个asci编码的字符。在仅仅使用英文字符的情况下一切正常,但是如果用了中文,比如:

s1=’哈’ 
print s1

 

这个代码文件被执行时就会出错,就是编码出了问题。python默认将代码文件内容当作asci编码处理,但asci编码中不存在中文,因此抛出异常。

解决问题之道就是要让python知道文件中使用的是什么编码形式,对于中文,可以用的常见编码有utf-8,gbk和gb2312等。只需在代码文件的最前端添加如下:

1 # -*- coding: utf-8 -*-

 

 

这就是告知python我这个文件里的文本是用utf-8编码的,这样,python就会依照utf-8的编码形式解读其中的字符,然后转换成unicode编码内部处理使用。

不过,如果你在Windows控制台下运行此代码的话,虽然程序是执行了,但屏幕上打印出的却不是哈字。这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的

是gbk,而在代码中使用的utf-8,python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。

解决办法一个是将源代码的编码也改成gbk,也就是代码第一行改成:

1 # -*- coding: gbk -*-

 

另一种方法是保持源码文件的utf-8不变,而是在’哈’前面加个u字,也就是:

1 s1=u’哈’ 
2 print s1

 

这样就可以正确打印出’哈’字了。

这里的这个u表示将后面跟的字符串以unicode格式存储。python会根据代码第一行标称的utf-8编码识别代码中的汉字’哈’,然后转换成unicode对象。如果我们用type查看一下’哈’的数据类型type(‘哈’),会得到

1 s1=unicode(‘哈’, ‘utf-8′) 
2 print s1

 

另外,用decode函数也可以将一个普通字符串转换为unicode对象。很多人都搞不明白python字符串的decode和encode函数都是什么意思。这里简要说明一下。

decode是将普通字符串按照参数中的编码格式进行解析,然后生成对应的unicode对象,比如在这里我们代码用的是utf-8,那么把一个字符串转换为unicode就是如下形式:

1 s2=’哈’.decode(‘utf-8′)

 

这时,s2就是一个存储了’哈’字的unicode对象,其实就和unicode(‘哈’, ‘utf-8′)以及u’哈’是相同的。

那么encode正好就是相反的功能,是将一个unicode对象转换为参数中编码格式的普通字符,比如下面代码:

1 s3=unicode(‘哈’, ‘utf-8′).encode(‘utf-8′)

 

s3现在又变回了utf-8的’哈’。

转载于:https://www.cnblogs.com/moying-wq/p/9973715.html

相关文章:

  • java数据结构基本框架
  • linux_用户以及权限
  • webpack4配置详解之新手上路初探
  • ConnectionState详解
  • Oracle EBS 获取用户挂的职责 请求 请求的类别(RTF还是什么的)
  • bzoj 2655 calc——拉格朗日插值
  • 关于mysql数据库的乱码问题
  • n阶行列式算法(c程序)
  • 2-2+CPU多级缓存-乱序执行优化
  • 正则表达式中/i,/g,/ig,/gi,/m的区别和含义
  • bzoj 2194 快速傅立叶之二 —— FFT
  • ELK使用2-Kibana使用
  • 用Inno setup制作以管理员权限启动的安装包
  • airtest自动化游戏脚本测试
  • 【WebApi】通过HttpClient调用Web Api接口
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • C++入门教程(10):for 语句
  • cookie和session
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • ES10 特性的完整指南
  • JavaScript 奇技淫巧
  • JavaScript对象详解
  • nginx 负载服务器优化
  • Node + FFmpeg 实现Canvas动画导出视频
  • OSS Web直传 (文件图片)
  • Promise面试题,控制异步流程
  • rc-form之最单纯情况
  • React as a UI Runtime(五、列表)
  • Redis 中的布隆过滤器
  • Vue组件定义
  • 多线程 start 和 run 方法到底有什么区别?
  • 翻译--Thinking in React
  • 基于axios的vue插件,让http请求更简单
  • 技术:超级实用的电脑小技巧
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 模型微调
  • 前端面试之闭包
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序 setData 学问多
  • gunicorn工作原理
  • python最赚钱的4个方向,你最心动的是哪个?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (ZT)薛涌:谈贫说富
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (第二周)效能测试
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (过滤器)Filter和(监听器)listener
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (九十四)函数和二维数组
  • (七)理解angular中的module和injector,即依赖注入
  • (十一)图像的罗伯特梯度锐化
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)基于IDEA的JAVA基础10