解决Python的print中文在windows命令行乱码问题

我们都知道如果想要在Python的代码中输入中文,必须在import前加上
# -*- coding: UTF-8 -*-,这样我们就可以在代码中输入中文了。

当你用notepad++或者editplus写代码时。
windows平台下,如果输出在命令行,经常会出现乱码或者decode错误
例如
str='你好'
print str
这时通常会出现下图这种情况

文字出现了乱码,是什么原因呢?
你说那我这样写呢
mes='你好'
print u'%s' %(mes)
你会发现如果是print u'你好' # 这样写没问题
但是上面的通常会出现下图的情况

UnicodeDecodeError:ascii 编码器不能解码 字节 0xe4 在位置0: 序号不在0到127里
为什么呢?
win+R,cmd回车打开命令行,输入chcp

936是我的window7中命令行的编码解码格式
你可以修改默认的格式,通过
首先输入chcp 格式代码,然后在命令行窗体上右键

点击属性

选中新出现的字体,确定就可以了。
例如chcp 95001就是utf-8



回到之前的话题,为什么Python在命令行会输出异常呢?
首先我们分析以下输出过程中编码解码的过程
print str
这里str是字符串引用,要想输出对应的内容,先找到对应的值,它在内存里面以字节码存储,然后将值解码成对应的字符串,再编码成你的命令行对应的格式的字节(如gbk)bytes。然后命令行会将你的字节码根据命令行的格式转化成字符串显示出来。

注意:编码成字节格式可以省略,因为Python会自动完成找到你命令行解码编码格式,然后转换成对应的字节码这个过程,使用的也是'ignore'。

decode()用于将bytes解码成指定格式字符串,encode()将字符串按指定格式编码成bytes,encode()还有第二个参数它能帮助你解决那么无法表达的字符串,'ignore'用来抛弃任何不能被编码的字符串,'replace'用来用?代替那些字符串。

好了,让我们在回头看看如何解决开头的问题
str='你好'
print str.decode('utf-8')
#print str.decode('utf-8').encode('gbk','ignore') #第二个参数是你命令行的格式

针对第二个问题,
mes='你好'
#有以下两种,可以写u也可以不写
print '%s' %(mes.decode('utf-8'))
#print '%s' %(mes.decode('utf-8').encode('gbk','ignore'))
---------------------------------------------------------------
print u'%s' %(mes.decode('utf-8'))
注意这时如果你这样写
print u'%s' %(mes.decode('utf-8').encode('gbk','ignore')),如下图

这句就可以看出u的作用了,u的作用是将后面的字符串转换成unicode对应的字节存储在内存中
也就相当于执行了
mes.decode('utf-8')这

个过程,当你直接print u'你好'时,u会把'你好'编码成uniocde对应的字节再输出,
这时也就等价于print '你好'.decode('utf-8'),因此输出正确。 但是当你print u'%s' %(mes)时,Python的会将''里的空字符串转变为unicode字节,再用默认的ascii解码器解码mes的内容
mes='snow'
print u'你好%s' %(mes)# 这样可以正常运行
也就是说u不能自动替变量解码
如果你一定要用u的话,可以使用下面的方法
print u'你好%s' %(mes.decode('utf-8'))
### Windows 11 命令行中 `javac` 输出乱码解决方案 在 Windows 11 的命令行环境中,当使用 `javac` 编译 Java 文件时,如果遇到输出乱码问题,通常是因为编码设置不一致所导致。以下是详细的解决方法: #### 1. 修改 CMD 的代码页 默认情况下,Windows 的 CMD 使用的是 GBK (Code Page 936) 编码格式。为了确保编译器输出的信息能够正确显示,可以手动更改 CMD 的代码页为 UTF-8 或者与系统区域设置相匹配的编码。 通过以下命令修改 CMD 的代码页为 UTF-8: ```cmd chcp 65001 ``` 此操作会临时改变当前 CMD 窗口的字符集为 UTF-8[^3]。 #### 2. 设置 `-encoding` 参数 在编译 Java 源文件时,可以通过指定 `-encoding` 参数来定义源文件的编码方式。例如,假设您的 Java 文件是以 UTF-8 格式保存的,则可以在编译时加入如下参数: ```cmd javac -encoding utf-8 TestEncode.java ``` 这样可以确保编译过程中不会因为编码不匹配而导致乱码问题[^2]。 #### 3. 调整系统的区域和语言设置 有时,即使设置了正确的编码,仍然可能出现乱码现象。这是因为操作系统本身的区域设置可能未配置为支持多字节字符集的语言环境。建议进入 **控制面板 -> 区域 -> 更改系统区域设置** 中勾选“Beta 版: 使用 Unicode UTF-8 提供全球语言支持”的选项[^4]。 #### 4. 配置 JVM 默认编码 对于某些情况下的全局性乱码问题,还可以尝试调整 JVM 启动时使用的默认编码。具体做法是在启动任何 Java 应用程序之前设定系统属性 `file.encoding` 为 UTF-8 。例如,在运行脚本开头增加下面这一句: ```cmd set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 ``` 或者直接将其写入到环境变量中永久生效。 #### 5. 注册表修正 CMD 字体渲染 部分版本的 Windows 存在一个已知缺陷——即即便指定了合适的编码模式,但由于字体原因仍会出现视觉上的乱码效果。对此可编辑注册表项 `[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]` 下的相关字段以启用 TrueType 类型字体的支持[^5]。 完成上述任意一种或多种组合措施之后再次测试即可消除大部分由编码差异引发的乱码状况。 ```python # 示例 Python 代码片段展示如何验证终端编码 import sys print(sys.stdout.encoding) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值