V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Sylv  ›  全部回复第 40 页 / 共 107 页
回复总数  2124
1 ... 36  37  38  39  40  41  42  43  44  45 ... 107  
2018-05-18 10:34:59 +08:00
回复了 yujunhao8831 创建的主题 Apple macbook pro 遇热就会卡顿
@yujunhao8831 没什么不敢的,底面螺丝旋开,吹吹灰就好,其它零件都不用拆,也不影响保修。
2018-05-18 10:07:59 +08:00
回复了 yujunhao8831 创建的主题 Apple macbook pro 遇热就会卡顿
打开清个灰?
2018-05-17 00:32:59 +08:00
回复了 qof3990 创建的主题 奇思妙想 汉字补完计划。
个人认为造新字不如找个已有生僻字来安新读音,要不然打都打不出来很难有人接受。
@XiiLii
Sublime Text 菜单里点击 Preferences -> Browse Packages,打开的目录就是 .../Sublime Text 3/Packages/,在此目录下若没有 Python 文件夹就新建一个,把下载的修改版 Completion Rules.tmPreferences (就叫这个名字)文件放到这个 Python 文件夹里。然后可能要删除文件夹 .../Sublime Text 3/Cache 和文件 .../Sublime Text 3/Local/Session.sublime_session 并重启后才会生效。
2018-05-12 06:16:22 +08:00
回复了 Windsooon 创建的主题 问与答 从零开始理解字符串编码
文章很不错。

不过挑几个 Python 2 相关的错,或者说是表述不准确的地方:

1--

「 python2 是把字符串直接经过 utf-8 编码保存的」
「出错的原因是因为 python2 当遇到 ASCII 表中没有的字符的时候,默认会把它们使用 utf-8 编码来存储」

其实并不是这样的,Python 2 并没有默认用 utf-8 编码来保存字符串,实际上在终端下输入的字符串的编码是由终端的编码决定的,也就是说终端用的是什么编码,Python 接收到的字符串就是什么编码。你这句话最多只能适用于 Mac 和大多数 Linux 系统等,因为它们终端的默认编码是 utf-8,所以在终端下输入 "你好",Python 接收到的是 utf-8 编码的 '\xe4\xbd\xa0\xe5\xa5\xbd'。但是在 Windows 下就不是这样了:
>>> '你好'
'\xc4\xe3\xba\xc3'

结果并不是 utf-8 编码的 '\xe4\xbd\xa0\xe5\xa5\xbd'。这是因为中文 Windows 系统 cmd 的默认编码是 cp936 (GBK),而不是 utf-8。可以通过 sys.stdin.encoding 来查看这个编码:
>>> import sys
>>> sys.stdin.encoding
'cp936'

所以在这种情况下输入 "你好",Python 接收到的二进制数据会是 '\xc4\xe3\xba\xc3',也就是 "你好" 的 cp936 编码:
>>> u'你好'.encode('cp936')
'\xc4\xe3\xba\xc3'

这个道理和 Python 读取文件内字符串是一样的,文件是什么编码,Python 读取到的字符串就是什么编码。Python 2 并没有默认使用 utf-8 编码来保存或读取字符串,而是由输入端(文件、终端等)的编码决定了 Python 2 获取到的字符串的编码。

2--


>>> '你好'.encode('gb2312')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

出错的原因是因为 python2 当遇到 ASCII 表中没有的字符的时候,默认会把它们使用 utf-8 编码来存储,但是 gbk 编码表无法对 utf-8 编码进行解码,这句话你可能需要读完文章才能理解。


这个例子里出错的原因并不是 gbk 编码表无法对 utf-8 编码进行解码。注意看这里报的错是 UnicodeDecodeError: 'ascii' codec can't decode,说的是 Python 无法用 ascii 编码来解码 '你好',和 gbk (gb2312) 编码没关系。而且 encode 是执行编码操作不是解码操作,你是在用 gb2312 对字符串进行编码,不是你文中说的「 gbk 编码表……进行解码」。

这里出错的真正原因是:你在 Python 2 下对 str 类型的字符串进行了 encode 操作,encode 操作只对 unicode 类型字符串才有意义( Python 3 里甚至不允许对非 unicode 字符串 (bytes) 进行 encode 操作,也不允许对 unicode 字符串 (str) 进行 decode 操作),所以 Python 2 在这里会隐式地尝试将 str 类型的 '你好' decode 为 unicode 类型字符串后再进行你要的 encode,这个隐式的 decode 操作使用的编码是 Python 2 的默认编码—— ascii,Python 的默认编码可以通过以下命令查看:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

所以执行 '你好'.encode('gb2312') 时相当于执行了:
'你好'.decode('ascii').encode('gb2312')

ascii 无法解码中文,所以报了 UnicodeDecodeError 错,此时还没有真正执行 encode('gb2312'),所以例子和你的解释并不适用。

正确的例子应该是:
>>> '\xe4\xbd\xa0\xe5\xa5\xbd'.decode('gbk')
u'\u6d63\u72b2\u30bd'
>>> u'\u6d63\u72b2\u30bd' == u'你好'
False

不用 '你好'.decode('gbk') 来举例是因为正如上文 1 所说,这段代码在中文 Windows 系统下是没有编码错误的:
>>> '你好'.decode('gbk') == u'你好'
True

而 '\xe4\xbd\xa0\xe5\xa5\xbd'.decode('gbk') 这个例子你会发现 Python 2 是能顺利运行没有报错的,并不像你说的「 gbk 编码表无法对 utf-8 编码进行解码」那样出现 UnicodeDecodeError 错误。甚至这个结果是能直接 print 出来的:
>>> print('\xe4\xbd\xa0\xe5\xa5\xbd'.decode('gbk'))
浣犲ソ

这是因为 '你好' 的 utf-8 编码和 '浣犲ソ' 的 gbk 编码是重合的,都是 '\xe4\xbd\xa0\xe5\xa5\xbd':
>>> u'你好'.encode('utf-8')
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> u'浣犲ソ'.encode('gbk')
'\xe4\xbd\xa0\xe5\xa5\xbd'

所以 gbk 编码表其实是可以对部分 utf-8 编码的字符串进行解码的,只是解码的结果不是我们想要的,也就是出现了乱码问题。

3--


另外常见编码错误就是使用错误的编码保存字符串,例如使用 ASCII 表保存”你好”,因为 ASCII 表里面没有对应的字符,它不知道如何保存。

>>> '你好'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)


这个例子应该是在 Python 3 下执行的结果,'你好' 得是 unicode 类型字符串对其 encode('ascii') 才会报 UnicodeEncodeError 错误,否则在 Python 2 下应该如 2 的例子一样报的是 UnicodeDecodeError 错误:
>>> '你好'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

也就是相当于执行了:
'你好'.decode('ascii').encode('ascii')

正确的例子应该是:
>>> u'你好'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

--

我以前也写过篇和 Python 2 中文 Unicode 编码问题有关的文章,供你参考:
https://www.v2ex.com/t/163786
2018-05-12 02:48:20 +08:00
回复了 Jay54520 创建的主题 Python Python2 显示 unicode 的问题
@Jay54520 到现在都没有这样一个完善的库也就说明了这样的需求并不是那么“普遍”。
2018-05-11 15:45:19 +08:00
回复了 iyg429 创建的主题 问与答 图片多,如何分类?
macOS 的 Photos 算一个吧。
2018-05-11 04:21:46 +08:00
回复了 Jay54520 创建的主题 Python Python2 显示 unicode 的问题
你的需求是在 Python 2 下直接 print 容器数据时内部的中文能直接显示出来, 但其实这只是个为了满足自己强迫症的“伪”需求,并不是一个编码问题。

因为 {u'中文': u'中文'} 和 {u'\u4e2d\u6587': u'\u4e2d\u6587'} 是等价的,用 print 来调试代码时没有必要一定要显示容器内部元素的 str 值,反而显示内部元素的 repr 值更利于调试。

例如 [u' ', u' '] 如果按你的要求 print 出来,内部的两个元素是看不出区别的,但实际上:
>>> print([u' ', u' '])
[u'\t', u' ']

一个是制表符,另一个是空格。从调试代码的角度上来说,显然后者更有利。

OK,你说是为了 print 出来给用户更好看。

首先就不应该直接 print 容器数据给用户看,真正的“用户”是没有 print 容器数据的需求的,他们是看不懂 {u'语言': u'中文'} 是什么意思的,你应该要将其格式化为“用户”真正可以理解的字符串后输出,例如:“语言设置是中文”。否则你所说的“用户”其实指的是写代码的人,那么正如我上述所说,这是个“伪”需求。

如果实在想要实现这个需求,你也不应该去折腾 print 和编码,因为 Python 的 print 就是这样设计的,这也并不是一个编码问题。你应该自己实现一个满足你需求的 print 方法,或者在 print 前将数据处理为可读形式后再 print,可以参考下下面这个链接里的方法:
https://stackoverflow.com/a/45841899
2018-05-11 01:44:51 +08:00
回复了 Meli55a 创建的主题 Python python3.6 字符编码问题
放上 requests 文档中关于编码的说明:

Encodings

When you receive a response, Requests makes a guess at the encoding to use for decoding the response when you access the Response.text attribute. Requests will first check for an encoding in the HTTP header, and if none is present, will use chardet to attempt to guess the encoding.

The only time Requests will not do this is if no explicit charset is present in the HTTP headers and the Content-Type header contains text. In this situation, RFC 2616 specifies that the default charset must be ISO-8859-1. Requests follows the specification in this case. If you require a different encoding, you can manually set the Response.encoding property, or use the raw Response.content.

http://docs.python-requests.org/en/latest/user/advanced/#encodings
2018-05-11 01:41:14 +08:00
回复了 Meli55a 创建的主题 Python python3.6 字符编码问题
requests 是通过 response 的头部( headers )来检测编码的。
虽然这页面在源码里声明了 charset,但是没在 'Content-Type' header 里声明 charset:
Content-Type: text/html

所以 requests 就使用了默认的编码 'ISO-8859-1':
>>> page.encoding
'ISO-8859-1'

于是就出现乱码问题了。

解决方法是手动设置 requests 解码这个页面使用的编码:
>>> page.encoding = 'utf-8'
>>> tree = html.fromstring(page.text)
>>> title = tree.xpath('.//*[@class="STYLE13"]/a')[0].text
>>> title
'2018 年 05 期'
2018-05-10 12:39:44 +08:00
回复了 ispinfx 创建的主题 macOS 有哪些方法可以搜索剪切板工具的历史?
2018-05-10 10:22:19 +08:00
回复了 ispinfx 创建的主题 macOS 有哪些方法可以搜索剪切板工具的历史?
Alfred 有这个功能。
Caps Lock 灯我没折腾过,因为我觉得打字时还要低头看键盘上的灯来查看输入法状态更不方便。理想状态是盲打不看键盘,视线一直保留在屏幕上,这样更有效率,思路不容易被打断。所以我认为输入法状态应该显示在屏幕上就够了,而不需要显示在键盘上,想知道当前输入法状态只要瞟一眼菜单栏上的输入法图标就行了。

不过我更喜欢的是给中英文输入法分别设置快捷键(左 ⌘ -> 英文,右 ⌘ -> 中文),这样都不需要判断当前输入法状态,直接无脑一键切换到所需的输入法。

Before:
https://i.imgur.com/GaVelWG.png

After:
https://i.imgur.com/tXaHScm.png

--

我试了下 BlahGeek 的 IMLight,至少在 OS X El Capitan (10.11.6) 下是能够通过 Caps Lock 灯显示当前中英文输入法状态的,不过只对自带键盘有效,外接键盘没有效果。
2018-05-08 04:22:35 +08:00
回复了 orangutan92 创建的主题 问与答 大家平时是怎么快速切换中英文标点输入的?
输中文的时候用中文标点,输英文时用英文的,反正都要切换中英文输入状态了,不明白为什么写代码时要在中文状态输入英文标点?
pipenv
2018-05-07 11:53:08 +08:00
回复了 xjy0454 创建的主题 NAS 家里的 NAS 被人盯上了
NAS 还是建议别直接暴露在外网,谁知道哪天就爆个 0day 出来,就像你说的 Synolocker。最好还是用 VPN 等方式连回内网再访问。
2018-05-06 22:56:52 +08:00
回复了 Tancred 创建的主题 Emacs 为什么在 Emacs 下打开 Python 文件就是显示 Tab 时 8 个字符
这就是为什么推荐用空格来缩紧的原因。
2018-05-06 10:09:43 +08:00
回复了 FX08 创建的主题 Python 想要逐行搜索 txt 里的全部内容,但是只 run 第一行就完成了
简单来说,你每次都是重新 open 文件来 readline() 一次,得到的当然只能是第一行。你要做的是,在 open 文件后,写个循环 readline() 读取整个文件的每一行。
建议你先找本 Python 基础教程过一遍,先把基础编程知识掌握下。
1 ... 36  37  38  39  40  41  42  43  44  45 ... 107  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3144 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 45ms · UTC 13:31 · PVG 21:31 · LAX 05:31 · JFK 08:31
Developed with CodeLauncher
♥ Do have faith in what you're doing.