123Marchapril 发表于 2021-5-10 21:00:34

关于编码的疑惑

本帖最后由 123Marchapril 于 2021-5-10 22:01 编辑

小甲鱼视频里说Python用的是Unicode的形式
在‘Python编码问题的结局方案’里说Python用的是utf-8形式

一:到底是用的哪种形式呢?我只知道Unicode是字符集,utf-8是一种编码形式,我觉得Python可以用Unicode这个大的集合,但是什么编码形式总得有默认的吧!
这两者怎么理解呢?这里很疑惑

二:如果Python用的是utf-8形式,那么在小甲鱼视频第54讲中,为什么data = urllib.parse.urlencode(data)不可以,必须得是data = urllib.parse.urlencode(data).encode('utf-8')?既然默认编码就是utf-8了,再编码成为utf-8不是多此一举吗?为什么这样写呢?

三:还有一个疑惑是,我怎么知道某个字符串是不是json格式呢?非常感谢!

import urllib.request
import urllib.parse
importjson

while True:
    content = input('请输入需要翻译的:')

    if content == 'stop'or content == '再见':
      print('再见')
      break


    data = {}
    data['i']= content
    data['doctype']= 'json'


    data = urllib.parse.urlencode(data)

    url = 'https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

    response = urllib.request.urlopen(url,data)

    html = response.read().decode('utf-8')

    d = json.loads(html)

    print('翻译结果: %s'% (d['translateResult']['tgt']))

123Marchapril 发表于 2021-5-10 21:28:05

为什么是审核中呀{:10_266:}

yuxijian2020 发表于 2021-5-11 08:47:22

python的默认编码是Unicode
在‘Python编码问题的结局方案’里说Python用的是utf-8形式 -->不知道你在哪看的我没听过

怎么知道字符串是不是 json 格式的问题,一般我会选择用眼睛看{:10_258:}

123Marchapril 发表于 2021-5-11 08:53:36

yuxijian2020 发表于 2021-5-11 08:47
python的默认编码是Unicode
在‘Python编码问题的结局方案’里说Python用的是utf-8形式 -->不知道你在哪 ...

小甲鱼亲自写的帖子说的:
使用 Python3,因为 Python3 默认使用 UTF-8 编码。
帖子地址:https://fishc.com.cn/forum.php?mod=viewthread&tid=56452&highlight=Python%B1%E0%C2%EB

123Marchapril 发表于 2021-5-11 08:54:31

本帖最后由 123Marchapril 于 2021-5-11 08:55 编辑

123Marchapril 发表于 2021-5-11 08:53
小甲鱼亲自写的帖子说的:
使用 Python3,因为 Python3 默认使用 UTF-8 编码。
帖子地址:https://fish ...

json格式用眼睛看哪里呀?我感觉跟字符串差不多{:10_282:}
我的意思是看哪里可以知道返回的是JSON格式呀?

yuxijian2020 发表于 2021-5-11 08:55:22

那你为什么不再往下看几行呢?

延伸知识:

1. 可以用以下方法获得当前的默认编码:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

123Marchapril 发表于 2021-5-11 08:57:23

yuxijian2020 发表于 2021-5-11 08:55
那你为什么不再往下看几行呢?

延伸知识:


所以我就觉得很乱,用sys.getdefaultencoding()的返回为什么不是Unicode呢?

yuxijian2020 发表于 2021-5-11 08:59:11

123Marchapril 发表于 2021-5-11 08:57
所以我就觉得很乱,用sys.getdefaultencoding()的返回为什么不是Unicode呢?

等我研究下,不过 utf-8 也是 Unicode 的一种扩展

123Marchapril 发表于 2021-5-11 09:02:28

yuxijian2020 发表于 2021-5-11 08:59
等我研究下,不过 utf-8 也是 Unicode 的一种扩展

我知道Unicode是字符集utf-8是一种编码形式,还有什么utf-16,utf-32,我的意思是Python自己得确定是哪种编码形式吧?

yuxijian2020 发表于 2021-5-11 09:09:44

我找到了这玩意

yuxijian2020 发表于 2021-5-11 09:16:09

我懂了,python3 就是 utf-8
所谓 Unicode 也是 utf-8
但是,根据系统不同,python 还会根据系统选择不同的默认编码

yuxijian2020 发表于 2021-5-11 09:18:04

给你一个查看字符串编码的方法吧
import chardet

s = "aaaaa"
print(chardet.detect(str.encode(s)))

我是win7,输出为
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

123Marchapril 发表于 2021-5-11 09:24:50

yuxijian2020 发表于 2021-5-11 09:18
给你一个查看字符串编码的方法吧




还有一个问题是我看服务器返回的JSON格式和文本格式没啥区别,我从哪里可以看到是JSON格式呢?或者我通过什么参数可以知道服务器返回的就是JSON格式?

yuxijian2020 发表于 2021-5-11 09:36:40

123Marchapril 发表于 2021-5-11 09:24
还有一个问题是我看服务器返回的JSON格式和文本格式没啥区别,我从哪里可以看到是JSON格式呢?或者我通过 ...

要么用眼睛看,要么就异常

又不是自己的服务器,鬼知道他是不是 json 格式

yuxijian2020 发表于 2021-5-11 09:37:20

异常的话,用 json 模块 load 下如果失败就说明不是 json 格式,成功就是 json 格式

123Marchapril 发表于 2021-5-11 09:38:03

本帖最后由 123Marchapril 于 2021-5-11 09:40 编辑

yuxijian2020 发表于 2021-5-11 09:36
要么用眼睛看,要么就异常

又不是自己的服务器,鬼知道他是不是 json 格式

还有一个问题是,在小甲鱼视频第54讲中,为什么data = urllib.parse.urlencode(data)不可以,必须得是data = urllib.parse.urlencode(data).encode('utf-8')?既然默认编码就是utf-8了,再编码成为utf-8不是多此一举吗?为什么这样写呢?

import urllib.request
import urllib.parse
import json
import sys
while True:
    content = input('请输入需要翻译的:')

    if content == 'stop'or content == '再见':
      print('再见')
      break


    data = {}
    data['i']= content
    data['doctype']= 'json'

    print(sys.getdefaultencoding())   #############
    data = urllib.parse.urlencode(data).encode('utf-8')##########

    url = 'https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

    response = urllib.request.urlopen(url,data)

    html = response.read().decode('utf-8')

    d = json.loads(html)

    print('翻译结果: %s'% (d['translateResult']['tgt']))


第17行每次都输出utf-8,那为什么第18行还要encode('utf-8')呢?既然已经是utf-8了,为什么还要编码为utf-8?

123Marchapril 发表于 2021-5-11 09:45:26

yuxijian2020 发表于 2021-5-11 09:37
异常的话,用 json 模块 load 下如果失败就说明不是 json 格式,成功就是 json 格式

你好,我还有个问题是,就是我提问问题的代码,我在17行加了一行:print(sys.getdefaultencoding()),然后每次都是输出utf-8,既然Python默认用的是utf-8,同时在本代码中也是用的utf-8,那么早提问问题的第18行为什么必须在后面加.encode('utf-8')???这不是多此一举吗???但是去掉就是不行

yuxijian2020 发表于 2021-5-11 09:49:50

123Marchapril 发表于 2021-5-11 09:45
你好,我还有个问题是,就是我提问问题的代码,我在17行加了一行:print(sys.getdefaultencoding()),然后 ...


仔细看看参数需要的是什么类型?

data = urllib.parse.urlencode(data)
    print(type(data))
    data = data.encode('utf-8')
    print(type(data))


再看看我加了一点之后输出的结果

yuxijian2020 发表于 2021-5-11 09:51:08

就因为他是utf-8所以才要编码(encode) 编码为字节码
解码是(decode),适用于把字节码转换为对应编码的字符串

123Marchapril 发表于 2021-5-11 09:59:29

yuxijian2020 发表于 2021-5-11 09:51
就因为他是utf-8所以才要编码(encode) 编码为字节码
解码是(decode),适用于把字节码转换为对应编码的字 ...

谢谢老哥!
页: [1] 2
查看完整版本: 关于编码的疑惑