关于 python 编码问题的疑惑

2016-11-17 15:08:12 +08:00
 gps32251070
初学 python ,今天在使用 django 的时候遇到一些编码问题,希望大神指教下。

https://gist.github.com/THK-1991/8af180fa4476b81dd70966c830f69f0d

我在访问 index 方法的时候不会报错,但是访问 news 方法的时候却报错,只有把第二个方法加上 u ,也就是这样才能正确输出

https://gist.github.com/THK-1991/3d5c9f431e8a5c410110bbd9081546ea

我想问加上 u 之后 python 到底干了什么动作,为什么第一个 index 方法就可以正常输出?
1859 次点击
所在节点    Python
9 条回复
Sylv
2016-11-17 15:16:07 +08:00
报的是 UnicodeEncodeError 错吗?
news_id 是不是有非 ascii 字符?
gps32251070
2016-11-17 15:20:05 +08:00
gps32251070
2016-11-17 15:20:37 +08:00
https://gist.github.com/THK-1991/3d5c9f431e8a5c410110bbd9081546ea
之前第二段贴错了,修改不了,应该是上面的
gps32251070
2016-11-17 15:21:10 +08:00
@Sylv 这个 ID 是从浏览器链接获取的数字
holajamc
2016-11-17 15:24:22 +08:00
Sylv
2016-11-17 17:11:15 +08:00
"新闻 ID 是:%s" % news_id
会报错是因为 news_id 是 unicode 类型,"新闻 ID 是:%s" 则是 str 类型,在格式化字符串时如果有参数是 unicode 类型,会将 str 类型字符串转换为 unicode 后再能格式化,最后的字符串也就是 unicode 类型。而 Python2 默认编码是 ascii ,用 ascii 编码转换 str 类型的 "新闻 ID 是:%s" 为 unicode 时就会报 UnicodeDecodeError 错了,因为其中包含非 ascii 字符的汉字。

u"新闻 ID 是:%s" % news_id
没有问题是因为两个字符串都是 unicode 类型,那么格式化后输出的也是 unicode 字符串,没有涉及到编码转换,所以不会报错。
Sylv
2016-11-17 17:14:41 +08:00
Django 的 HttpResponse 方法应该 str 和 unicode 两种类型的字符串都能接收, Django 内部应该会自动处理编码转换,所以 HttpResponse("这是首页") 可以正常输出。
stamaimer
2016-11-17 22:25:23 +08:00
@Sylv 为啥 news_id 是 unicode 类型?
stamaimer
2016-11-17 23:28:18 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/321192

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX