`
wjm251
  • 浏览: 110031 次
  • 性别: 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之类的国际通用编码才能真正简化,但是你仍然无法保证使用者与你的环境相同,不然你的用户群就会比较小了。
分享到:
评论

相关推荐

    linux下使用python调用海康威视SDK包

    在Linux环境下,使用Python调用海康威视(Hikvision)的SDK包是一个常见的任务,这主要涉及到视频监控系统的远程访问和控制。海康威视作为全球领先的安防产品及解决方案提供商,提供了丰富的SDK供开发者集成到自己的...

    python 2.6.6 For linux

    Python 2.6.6是Python编程语言的一个旧版本,主要针对Linux操作系统。在Python的发展历程中,2.6系列是介于Python 2.5和2.7之间的版本,发布于2009年,并在2013年停止了主要更新。尽管现在官方推荐使用更现代的版本...

    Python实现编码ANSI转UTF8

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

    Linux Centos7之由Python2升级到Python3教程.txt

    ### Linux CentOS7 从 Python 2 升级到 Python 3 教程 #### 引言 随着 Python 2 在 2020 年 1 月 1 日正式停止支持,越来越多的企业和个人开发者开始将原有的 Python 2 项目迁移至 Python 3。对于在 CentOS 7 上...

    Python设置默认编码为utf8的方法

    通过学习Python的`str`、`unicode`、`encode`、`decode`等相关概念,以及`codecs`、`io`等模块的使用,可以更有效地管理各种编码的文本数据。 总之,尽管Python默认的源代码编码是ASCII,但可以通过一些方式设置...

    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...

    python2.7编码1

    总的来说,Python 2.7中的编码问题是一个复杂但重要的主题,开发者需要理解字符串类型、字符编码、操作系统默认编码以及Python解释器的默认编码之间的关系,以避免出现乱码和解析错误。正确地处理编码和解码是编写可...

    linux下python中文乱码解决方案详解

    在Linux环境下,Python程序处理中文字符时经常遇到乱码问题,这主要涉及到编码设置和字体配置。本篇文章将深入探讨如何解决Linux下Python中文乱码的常见问题,并提供实际操作的解决方案。 首先,问题通常出现在当...

    一种基于Python实现中文编码格式转换工具的源码

    由于Python的跨平台性,这个工具可以在Windows、Linux或MacOS等各种操作系统上运行。 总的来说,Python的编码处理能力和灵活性使得开发这样的工具变得相对简单。通过理解各种编码的原理和Python的`codecs`模块,...

    【Pycharm(Win)+Python2(Linux)开发环境搭建】

    在搭建跨平台的Pycharm(Win)+Python2(Linux)开发环境过程中,涉及到的关键知识点可以分为以下几个方面: 1. 系统版本说明: - Windows端:使用的是Windows 7 64位操作系统。 - Linux端:使用的是Ubuntu 14.04.5 ...

    python学习教程,如何解决Python中文编码乱码问….docx

    ### Python中文编码问题详解 #### 一、问题背景与概述 在进行Python编程时,我们经常会遇到中文编码的问题。特别是当我们在程序中尝试输出或处理中文字符串时,如果没有正确地设置编码方式,就会出现乱码或者是...

    Python字符编码_中文乱码.pdf

    ### Python字符编码与中文乱码问题详解 ...以上内容覆盖了Python字符编码的基本概念、系统默认编码、源文件编码格式的选择、控制台输出及文件读写的注意事项等方面,希望对解决中文乱码问题有所帮助。

    超完整 Python基础入门知识教程 Python从入门到进阶知识大全 Python开发基础知识能力集全部课件 1885页

    Python的中文支持可以使用Unicode编码来表示中文字符。Python的输入变量可以使用input函数来获取用户输入。Python的类型标示符包括int、float、str、list、tuple、dict等。Python的关键字包括and、or、not、if、elif...

    Python-smsutil用于编码解码和分解SMS短信的Python工具类

    5. 兼容性:smsutil库是跨平台的,可以在任何支持Python的系统上运行,包括Windows、Linux、Mac OS等。它也适用于不同的Python版本,比如Python 2.x和Python 3.x。 6. 开发与贡献:作为开源项目,smsutil由Jezeniel...

    国产凝思linux系统v6.0.80版,安装python3.7

    在国产凝思Linux系统v6.0.80版本中,如果你希望升级或安装Python 3.7,这个过程可以通过以下步骤实现。由于系统默认的Python 3版本为3.4.2,为了确保顺利安装并设置Python 3.7为默认版本,你需要遵循以下详细步骤: ...

    python-2.6.9.tgz

    此版本在Python 2.x系列中是最后的维护版之一,为那些由于兼容性问题无法立即升级到Python 3的项目提供了支持。 1. **语法特性**: - Python 2.6.9支持经典的类定义,与Python 3中的新式类有所不同。经典类在继承...

    Python-zfec一个高效便携erasure编码工具

    在描述中提到,Python-zfec是“高效”和“便携”的,这意味着它可以在各种操作系统上运行,包括Windows、Linux和Mac OS等,并且处理速度较快,适合处理大量数据。这使得它成为分布式存储系统、云计算环境和大数据...

Global site tag (gtag.js) - Google Analytics