当前位置: 首页 > 面试题库 >

了解Python Unicode和Linux终端

狄兴业
2023-03-14
问题内容

我有一个Python脚本,该脚本使用UTF-8编码写一些字符串。在我的脚本中,我主要使用该str()函数来强制转换为字符串。看起来像这样:

mystring="this is unicode string:"+japanesevalues[1] 
#japanesevalues is a list of unicode values, I am sure it is unicode
print mystring

我不使用Python终端,仅使用标准的Linux Red Hat x86_64终端。我将终端设置为输出utf8字符。

如果我执行此操作:

#python myscript.py
this is unicode string: カラダーズ ソフィー

但是,如果我这样做:

#python myscript.py > output

我遇到了典型的错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 253-254: ordinal not in range(128)

这是为什么?


问题答案:

终端具有一个字符集,Python知道该字符集是什么,因此它将自动将您的Unicode字符串解码为终端使用的字节编码(在您的情况下为UTF-8)。

但是,当您重定向时,您将不再使用终端。您现在仅使用Unix管道。该Unix管道没有字符集,Python无法知道您现在想要哪种编码,因此它将退回到默认字符集。您已经用“
Python-3.x”标记了问题,但是print语法是Python
2,因此我怀疑您实际上是在使用Python2。然后sys.getdefaultencoding()通常是'ascii',在您的情况下肯定是这样。当然,您不能将日语字符编码为ASCII,因此会出现错误。

使用Python
2时,最好的选择是在打印字符串之前先用UTF-8对其进行编码。然后重定向将起作用,并且生成的文件为UTF-8。但这意味着如果您的终端不是其他终端,它将无法正常工作,但是您可以从终端编码中获取sys.stdout.encoding并使用该终端编码(在Python
2下重定向时为None)。

在Python 3中,您的代码应按原样工作,除了需要更改print mystringprint(mystring)



 类似资料:
  • 问题内容: 我试图了解嵌入式Linux应用程序的内存使用情况。该实用程序/文件似乎是查看详细信息的好资源。不幸的是,我不理解所有的列和条目。 匿名索引节点0条目是什么意思?这些似乎是一些较大的内存段。 问题答案: 中的每一行都描述了进程或线程中连续虚拟内存的区域。每行都有以下字段: 地址 -这是进程地址空间中区域的开始和结束地址 权限 -描述如何访问区域中的页面。有四种不同的权限:读取,写入,执行

  • 终止任务是一个正在开发的功能. 这里的终止任务并不是指终止一个任务, 而是指一个无论运行结果如何最后都会被执行的任务. 例子 15.27. 加入一个任务终止器 build.gradle task taskX << { println 'taskX' } task taskY << { println 'taskY' } taskX.finalizedBy taskY gradle

  • 问题内容: 我想使用mmap通过将具有MAP_SHARED标志集的mmap()与固定大小的结构与众所周知的文件名相关联,在Linux下运行的C程序中实现程序状态某些部分的持久性。出于性能原因,我不希望完全不调用msync(),并且没有其他程序将访问此文件。当我的程序终止并重新启动时,它将再次映射相同的文件并对其进行一些处理以恢复终止之前的状态。我的问题是这样的:如果我从不在文件描述符上调用msyn

  • 问题内容: 在这个sqlfiddle中… http://sqlfiddle.com/#!6/b6587/6 我收到以下错误…。 声明终止。在语句完成之前,最大递归100已用尽。 我知道CTE第二选择的where子句中需要进行“终止检查”。即使您取消注释WHERE子句,我也会遇到相同的错误。 我只是想了解1)为什么根本需要它……毕竟每个订单行都与每个客户行都有关系,2)由于需要“终止检查”,因此该示

  • 本文向大家介绍详解Linux终端 MySQL常用操作指令,包括了详解Linux终端 MySQL常用操作指令的使用技巧和注意事项,需要的朋友参考一下 服务: 添加环境变量: 1.数据库指令: 2.进入MySQL表单操作 3.增删改查 新增万能用户 用户名user_1 密码是123456 可以自任何PC上登录这个用户对数据库操作 创建只有在本机才能操作数据库的用户 用户名user_2 密码是12345

  • 前面介绍了如何安装虚拟机,还介绍了如何在虚拟机上安装 CentOs 操作系统,并且给 CentOs 配置了局域网固定 ip,那么此时的 CentOs 相当于是在局域网的一台服务器了,虚拟机上面已经自带终端工具,实际业务中使用较多的是终端工具连接远程服务器,较为常见的 Linux 服务器终端连接工具有 xshell、MobaXterm、putty 等等。其中 MobaXterm 对个人免费使用,且功