Python 2.6.6 Ubuntu服务器os.environ非unicode

Python 2.6.6 Ubuntu服务器os.environ非unicode,python,apache,unicode,utf-8,Python,Apache,Unicode,Utf 8,我正在尝试编写一个简单的聊天系统,它可以接受各种语言并自动翻译,同时在旁边打印原始语言和第二语言(例如英语) 但是,我遇到了很多问题,我认为原因是Python将os.environ读取为字节字符串,使用ASCII,而不是Unicode。我需要能够以unicode、utf-8从Apache检索查询字符串环境变量,以便能够实际获得不同字符集的文本。现在,他们都以?s的形式出现 我是否可以改变这一点,以便python可以用unicode读取os.environ?这是Apache、Linux还是Pyth

我正在尝试编写一个简单的聊天系统,它可以接受各种语言并自动翻译,同时在旁边打印原始语言和第二语言(例如英语)

但是,我遇到了很多问题,我认为原因是Python将os.environ读取为字节字符串,使用ASCII,而不是Unicode。我需要能够以unicode、utf-8从Apache检索查询字符串环境变量,以便能够实际获得不同字符集的文本。现在,他们都以?s的形式出现

我是否可以改变这一点,以便python可以用unicode读取os.environ?这是Apache、Linux还是Python本身的问题?我已经在谷歌搜索了几个小时了,大部分答案都是关于python 3的,我很犹豫是否升级到它(但如果没有其他选择,我会升级)

我让Apache将所有字符集覆盖为utf-8,所以我的所有页面都是这样强制的

这是我非常简单的HTML测试:

<form action=exec/post.py method=post><input type=text name='a'><input type=submit></form>

然后,如果您查看输出的源,它会将类型显示为str,而不是unicode

os.environ
始终仅为字节,URL和查询字符串也是如此

您需要在自己的代码中解码此类信息:

print u'{0}: {}'.format(key, value.decode('utf8'))

这是流(网络连接、文件、管道等)如何工作的基础;它们总是包含字节。这些字节可以以不同的方式进行解释,如果它们包含Unicode值,则需要显式解码。

不需要为此升级到Python 3。您需要解码字符串以获得Unicode值。这将显示所有值现在都是unicode:

for key,value in os.environ.items():
    print key + ":"+ str(type(value.decode("utf-8")))

谢谢你的快速回复。我已经试过了,但我又试了一次,并抄袭了你,以确保我没有错过任何东西。我还是得到了?????而不是。对不起,你是对的。请参阅路易斯答案中的解释/问题。请注意,这是双向的;发送回浏览器需要重新编码。嗯。。。所以,你是对的。我花了一段时间才意识到这一点,因为出于某种原因,如果显式键入URI(好吧,IRI),它仍然显示为???,但如果我提交表单,它确实会转换为Unicode。Chrome浏览器允许我显式键入,但IE和Opera不允许。知道为什么吗?奇怪的是,我可以去谷歌翻译,在IRI中输入不同的字符,而且效果很好。这不是必需的功能,但它会很好@Keozon我理解您在输入URI时询问浏览器字段中出现的问号。如果我理解正确,那么这是一个浏览器问题,而不是Python问题。这可能还取决于您的操作系统,因为操作系统通常为应用程序提供语言支持。不,我的意思是,如果我删除type()并只查看实际值,当我通过表单提交时,这很好,但是如果我在浏览器栏中键入它,(例如,post.py?a=СццСц),它将显示为???,但仅在某些浏览器中显示。如果我去谷歌做同样的事情,那么当你检查代码中
a
的值时,所有浏览器都会在那里工作(例如,)@Keozon它是
str
还是
unicode
类型?它是否因浏览器而异?
for key,value in os.environ.items():
    print key + ":"+ str(type(value.decode("utf-8")))