`
wjm251
  • 浏览: 108772 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

linux python等相关编码问题杂

阅读更多
起因:

python源文件头都设置了coding=cp936
locale设置的是zh_CN.GBK, samba的配置文件中没有与字符集有关的设置
用户通过samba共享放入一个含中文名的文件夹“中国”,然后在linux系统下使用os.path.exists(“中国”)会返回false,但人工去看这个文件确实是存在的。
在shell中用os.listdir(“.”)查看发现这个文件夹处总是'\xe4\xb8\xad\xe5\x9b\xbd',和shell的locale无关,而我们在windows平台下看“中国”这两个字是这样的:'\xd6\xd0\xb9\xfa'


linux系统无论Lang设置成什么,文件名必须encode成utf-8的str对象,os.path.exists才能正确使用。(当locale是zh_CN.utf-8时,u"路径"方式的也可,可能是内部自己转了)
在java中也一样
String f = "/home/xxx/模板";
File fl = new File(f);
System.out.println(fl.exists());

我写这几句java代码,等编译为class文件后,
如果在控制台把locale设置为zh_CN.utf-8,就可以打出true, 如果locale设置为zh_CN.GBK,就不行了,结果是false (我这个文件夹确实是存在的)
结论:
linux系统的“文件名”编码,也有人回复说保存在inode中的文件名是用utf-8编码的,
这个和sys.getdefaultencoding()或sys.getfilesystemencoding()都没关。
处理linux文件路径必须是utf-8格式的,或者为通用使用u"路径"方式,这样前提是要求locale必须是zh_CN.utf-8
-----------经证实,linux中的文件名(或者说保存在某个地方比如inode的文件名)所使用的编码,是由创建文件时的locale影响的。所以上述“模板”这个文件夹是在utf-8的locale下创建的。如果在控制台下操作,还要注意控制台的编码也要设置成和locale一样才能识别正确的编码
javaeye帖子http://www.iteye.com/topic/702140%231559919

mount 时设置参数 codepage是对方机器的编码方式(即所mount机器的代码页),iocharset是本地使用的编码方式(当前linux控制台的locale设置)。通常mount一个windows的FAT文件系统时设置为-o codepage=cp936,iocharset=utf8
--------------想想就知道什么原因了。总之这样设置之后两天都能正常读写。

samba
在配置文件smb.conf中的global段,可做如下设置(来自http://yumi.ztu.edu.ua/docs/samba30/unicode.html)
unix charset
    This is the charset used internally by your operating system. The default is UTF-8, which is fine for most systems, which covers all characters in all languages. The default in previous Samba releases was ASCII.

display charset
    This is the charset Samba will use to print messages on your screen. It should generally be the same as the unix charset.

dos charset
    This is the charset Samba uses when communicating with DOS and Windows 9x/Me clients. It will talk unicode to all newer clients. The default depends on the charsets you have installed on your system. Run testparm -v | grep "dos charset" to see what the default is on your system.

rcsmb restart 重启samba
看来不设置的话就默认了用utf-8(也许和locale有关)了。所以有开头那个问题

python中获得各种编码的方法
import os
import sys
import locale

import codecs
print 'locale.getpreferredencoding():',locale.getpreferredencoding();
print 'codecs.lookup(locale.getpreferredencoding()).name :',codecs.lookup(locale.getpreferredencoding()).name

print 'locale.getdefaultlocale():',locale.getdefaultlocale()
print '系统的缺省编码:sys.getdefaultencoding():', sys.getdefaultencoding()

"""the name of the encoding used to convert Unicode filenames into system file names, or None if the system default encoding is used. The result value depends on the operating system"""
print '文件系统的编码:sys.getfilesystemencoding():', sys.getfilesystemencoding()
print '终端的输入编码:sys.stdin.encoding:', sys.stdin.encoding
print '终端的输出编码:sys.stdout.encoding:', sys.stdout.encoding
代码的缺省编码: 文件头上# -*- coding: utf-8 -*-

几种语言的对应关系
c++        java        python2.x
char[]或string   byte[]   str
wchar_t[]或wstring  String unicode

windows中的MBCS(Muilti-Bytes Charecter Set,多字节字符集)或美国国家标准局(ANSI),在中文简体中是指GBK系,繁体中指big5,MBCS应该重在介绍多字节混排的格式,而非指定必须采用哪种编码


locale模块是Python国际化和本地化支持库的一部分. 他提供一种用于处理那些可能依赖于你用户语言或位置的操作的标准方式. 例如, 货币格式化, 比较字符串以便排序, 处理时间日期. 他没有包含翻译(可参见gettext模块)或Unicode编码.

由于可以在应用程序范围内改变本地化设置, 所以推荐用户避免在库中改变值而是让应用程序一次性设置.


Ulipad和Uliweb作者,CpyUG管理员limodou:
这是当然了的。你随便写的一个包含中文处理的程序,老外拿去运行可能就会有问题。老外写的程序,你用来处理中文可能也会有问题。要想避免就必须进行unicode和环境的判断。比如自动识别utf-8文件,通过locale.getdefaultlocale()得到操作系统当前的编码,通过sys.getdefaultencoding获得python环境的编码,通过sys.getfilesystemencoding获得操作系统文件系统的缺省编码,使用locale.setlocale(locale.setlocale(locale.LC_ALL,"zh_CN.UTF-8"))来设置编码,等等手段来判断你的环境。
中文化,国际化不是件简单的事情,本来就不简单。使用utf-8之类的国际通用编码才能真正简化,但是你仍然无法保证使用者与你的环境相同,不然你的用户群就会比较小了。
分享到:
评论

相关推荐

    Python实现编码ANSI转UTF8

    Windows文档默认编码是ANSI,Linux文档默认编码是UTF8。项目进行平台移植(Windows—>Linux)时涉及到大量文档编码格式转换,即TXT文档编码ANSI转UTF8。 代码中Python实现了指定目录下TXT文档编码ANSI转UTF8。批量...

    Linux离线安装Python第三方库Requests

    # 字符编码检测模块 pip install chardet-3.0.4-py2.py3-none-any.whl # 域名解析模块 pip install idna-2.8-py2.py3-none-any.whl # 线程安全的 HTTP 库 pip install urllib3-1.25.7-py2.py3-none-any.whl tar -...

    将python中的形如"\\uXXXX"的字符变为linux UTF8汉字(windows GB汉字)的源码

    因为c和python对接,接收到了u编码,而不是u编码。百度没有解决办法,故自己写了一个.zip 将python中的形如"\\uXXXX"的字符变为linux UTF8汉字(windows GB汉字)的源码 python中的汉字是\uXXXX,但是通过socket传给c...

    2019千峰Python超详细入门教程(百度云盘分享).docx

    ├─千锋Python教程:第01章 第一个Python程序与数据存储及数据类型(9集) │ │ .DS_Store │ │ │ ├─code │ │ 1、数据存储.txt │ │ 2、第一个python程序.py │ │ 3、注释.py │ │ 4、输出与输入.py │ ...

    python使用chardet判断字符串编码的方法

    最近利用python抓取一些网上的数据,遇到了编码的问题。非常头痛,总结一下用到的解决方案。 linux中vim下查看文件编码的命令 set fileencoding python中一个强力的编码检测包 chardet ,使用方法非常简单。linux下...

    Python语言程序设计PPT课件.zip

    由于大数据专业学生对程序设计的要求不是很高,但又需要具备一定的计算思维能力,熟悉用程序进行数据分析的一般流程,因此程序设计教材要言不甚深、文不甚俗,既要覆盖相关技术,又不能面面俱到,注重对问题的分析和...

    Python语言程序设计习题答案.zip

    由于大数据专业学生对程序设计的要求不是很高,但又需要具备一定的计算思维能力,熟悉用程序进行数据分析的一般流程,因此程序设计教材要言不甚深、文不甚俗,既要覆盖相关技术,又不能面面俱到,注重对问题的分析和...

    linux下python利用短信猫发短信

    利用python编写的短信猫发短信,linux下运行,短信内容用pdu编码,内含中文和字符、数字转unicode的代码。

    daemon_python:Linux守护进程的python实现

    Linux守护进程设计规范及python实现首先,守护进程是一类在后台执行,生命周期较长的进程,它一般随系统启动运行,在系统关闭的时候停止。守护进程编码规范:首先要做的被称为 umask,这一步骤会将文件创建掩码重置...

    Python实现ISODATA算法

    用python实现模式识别中的ISODATA算法。由于是在Windows下编程,所以在linux下会出现编码问题,建议在Windows下测试。

    解决python运行效率不高的问题

    虽然使用python的编程人员都应该接受其运行效率低的事实,但python在越多越来的领域都有广泛应用,比如科学计算 、web服务器等。程序员当然也希望python能够运算得更快,希望python可以更强大。 首先,python相比...

    python判断字符串编码的简单实现方法(使用chardet)

    本文实例讲述了python判断字符串编码的方法。分享给大家供大家参考,具体如下: 安装chardet模块 chardet文件夹放在/usr/lib/python2.4/site-packages目录下 [root@sha-sso-data01 chardet]# python Python 2.4.3 ...

    Python基础面试题

    Python是一种高级编程语言,由Guido van ...此外,Python还具有跨平台特性,可以在Windows、macOS和Linux等操作系统上运行。它还支持多种编程环境,如IDLE、PyCharm、Jupyter Notebook等,方便开发者进行编码和调试。

    linux-v4l2-source_pianoabk_文件采集器_v4l2编码并生成h264文件_v4l2采集_v4l2h264

    v4l2采集摄像头数据并编码成h264文件

    Python语言程序设计源代码.zip

    本书围绕数据的表示、存取、计算、分析和可视化等内容分两部分详细介绍Python语言程序设计:Python程序设计基础部分(第1章至第6章、第10章)主要介绍Python作为一门高级编程语言所涉及的语法知识、控制结构、函数与...

    基于v4l2和x264的视频编码采集系统

    基于v4l2和x264的视频编码采集系统,qt工程,linux下使用

    linuxfd:Linux事件的Python绑定

    linuxfd:Linux系统的Python接口调用eventfd / signalfd / timerfd 版权所有(C)2014-2020年Frank Abelbeck 执照:LGPL-3 平台 Linux(内核版本> = 2.6.27); 需要激活的内核选项CONFIG_TIMERFD,CONFIG_...

    xdelta3-python:使用xdelta3在python中进行快速增量编码

    使用xdelta3在python中进行快速增量编码。 要求 Python 3.5或3.6-是2017年,无论如何您现在应该使用python 3.6。 linux-编译仅在ubuntu上进行了测试,可能在其他平台上也可以使用。 安装 pip install xdelta3 用法...

    python(1).docx

    python(1) Python 开源项目及示例代码 本页面是俺收集的各种 Python 资源,不定期更新。...5.1.3 应用层 5.2 编码和解码 python(1)全文共28页,当前为第1页。5.3 网络开发框架 python(1)全文共28页,当前

    tinycore_with_python_plus:为 Python 开发等重新制作 Tiny Core Linux

    为 Python 开发等重新制作 虽然这比大得多,下载需要更长的时间,但与进行所有必要的 TCE 安装 (tce-load) 和配置相比,安装/设置所需的时间要少得多。 这个 remaster 包括使用 Python 编码所需的一切: Tiny Core ...

Global site tag (gtag.js) - Google Analytics