吐血:如何在 Windows 7 中创建一个可以处理 unicode 的好斗的 python 和 postgres 生态系统

Puking blood: how to make a scrapy, python, and postrgres ecosystem inside Windows 7 that can deal with unicode

真的 如果有人能帮助我解决我在下面描述的问题,或者(最坏的情况)建议一个可行的替代环境(虽然我很讨厌升级到 Windows 10)


我正在从日本网站上抓取大部分为英文的网页。一些必填字段中有汉字。

我在 Windows 7 安装中使用 scrapy、postgres 9.5 和 python 2.7。

Scrapy 必须 运行 在 cmd.exe shell 中,我正在检查 psql.exe 实例中的数据库结果也在 运行ning 中一个 cmd.exe shell。我一直在为 cmd.exe.

使用 Console2 应用程序

在此设置中进行调试是一种糟糕的体验:

scrapy shell

我无法执行任何诊断 print() 消息,因为汉字导致异常

>  print st['kanji_name']   
> File "C:\Users\mds\Anaconda2\lib\encodings\cp437.py", line 12, in encode
>     return codecs.charmap_encode(input,errors,encoding_map) UnicodeEncodeError: 'charmap' codec can't encode characters in
> position 0-8: character maps to <undefined>

我已经看到有关将活动代码页更改为 chcp 65001 的解决方案,但 scrapy 显然不理解 cp65001

C:\Users\_python\j_school>chcp 65001
Active code page: 65001

抛出错误:

C:\Users\_python\j_school>scrapy crawl j_school

Traceback (most recent call last):
  File "C:\Users\s\Anaconda2\lib\site-packages\twisted\internet\defer.py", line 588, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:\Users\_python\j_school\j_school\spiders\j_school_spider.py", line 141, in parse
    print(st['english_name'])
LookupError: unknown encoding: cp65001

PSQL

PSQL 已经在启动时警告我

C:\Program Files\PostgreSQL.5\bin>psql m_experiment postgres
psql (9.5rc1)
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.

无论我是否尝试 chcp 65001,psql 仍然不会打印这些。

m_experiment=# select * from schools limit 1;
ERROR:  character with byte sequence 0xe6 0x9d 0xb1 in encoding "UTF8" has no equivalent in encoding "WIN1252"

我也尝试过设置 client_encoding,但是这会导致一些错误,而 postgres 坚持认为我内存不足!

m_experiment=# SET client_encoding = 'UTF8';
SET
m_experiment=# show client_encoding;
Not enough memory.
m_experiment=#

我在 2011 年左右发现了多个关于此问题的错误报告,但从未修复过???反正我found a manual way to fix itpset pager off咒语解决问题

现在 psql 至少可以吐出一个响应,尽管它不能正确呈现汉字。

m_experiment=# select english_name, kanji_name from schools limit 1;
            english_name             |     kanji_name
-------------------------------------+--------------------
 TOKYO INTERNATIONAL JAPANESE SCHOOL | æÂ±äº¬å›½é𛿗¥æœ¬èªžå­¦é™¢
(1 row)

一个黑客解决方案是将我的语言环境更改为日语。现在控制台正确显示了我的汉字。但此后它搞砸了显示(>提示奇怪地出现并且光标图形与光标实际所在的位置不对齐!)。

根据您的错误消息,cp437 是美国 Windows 控制台默认编码。您可以尝试暂时将您的系统区域设置切换为 "Japanese(Japan)",以便您可以将汉字打印到控制台。转到“控制面板”、“区域和语言”、“管理”选项卡并单击 "Change system locale..."。重新启动后,默认 Windows 控制台默认编码应该是适合日文的编码。

我之前这样做是为了将中文打印到控制台。该设置仅影响非 Unicode 程序,现在大多数程序都是完全 Unicode。