如何在sqlite控制台中正确显示中文字符?

时间:2014-06-02 02:29:35

标签: sqlite

以下是utf-8格式的示例csv文件,可以在win7的记事本中打开,中文字符显示正确,请下载。
http://pan.baidu.com/s/1sj0ia4H

打开cmd,然后设置chcp 650001。

C:\Users\pengsir>sqlite3  e:\\test.db   
SQLite version 3.8.4.3 2014-04-03 16:53:12  
Enter ".help" for usage hints.
sqlite> create table ipo(name TEXT,method TEXT);
sqlite> .separator ","
sqlite> .import  "e:\\tmp.csv"  ipo
sqlite> select * from ipo;
000001,公开招募
000002,申请表抽签é™é¢è®¤è´­
000004,定å‘å‘è¡Œ
000005,银行储蓄存å•æ–¹å¼
000006,申请表抽签é™é¢è®¤è´­
000007,自办å‘è¡Œ
000008,自办å‘è¡Œ
000009,定å‘å‘è¡Œ
000010,定å‘å‘è¡Œ
000011,申请表抽签等é¢è®¤è´­
sqlite>

为什么同样的sqlite命令可以在sqlitemanager中正确显示? 如何设置在sqlite控制台中显示中文字符?

enter image description here

在pysqlite3中,它可以在python控制台中正确显示。

>>> import sqlite3  
>>> con=sqlite3.connect("e:\\test.db")   
>>> cur=con.cursor()   
>>> cur.execute("select * from ipo;")  
<sqlite3.Cursor object at 0x01751720>  
>>> print(cur.fetchall())   
[('000001', '公开招募'), ('000002', '申请表抽签限额认购'), ('000004', '定向发行'   
), ('000005', '银行储蓄存单方式'), ('000006', '申请表抽签限额认购'), ('000007',   
'自办发行'), ('000008', '自办发行'), ('000009', '定向发行'), ('000010', '定向发   
行'), ('000011', '申请表抽签等额认购')]   
>>>   

2 个答案:

答案 0 :(得分:5)

这个问题是如何构思的 Command Prompt window 显示字符,而不是如何sqlite3 打印输出;

在此处作为简单演示,我们绝对排除sqlite3并按type command查看文件:

让我们看看在其他不同的O.S.中发生了什么,例如在OSX中: <img src="./OSX-ISO8859-1.png" /> ISO-8859-1 对应(Windows latino 1),windows等效代码页设置:chcp 819 <img src="./OSX-UTF-8.png" /> UTF8 对应 Unicode(UTF-8),windows等效代码页设置:chcp 65001

在Windows中也会发生相同的行为: 使用命令chcp检查和/或设置当前的代码页

<img src="./WIN-XP.png" />

注意:这是意大利Windows XP的屏幕截图,你可以看到仍然没有运气! :-(,在这种情况下,原因在于可配置的可用字体泄漏  我的“Windows XP”框中的command prompt properties

我希望这不是你的“Windows 7”框的情况(但如果是的话,请留下评论,以便在答案的这一部分更具体)。 ..当问题切换到“可用字体”时,将安装其他语言支持,仍然需要chcp 65001强制UTF-8:

<img src="./OK.png" />

如何获得正确的字体

按照我在ITA WinXP SP2上获得结果的步骤列表,如上面的屏幕截图所示:

步骤1在您的计算机上安装东亚语言文件

讲座链接:to install East Asian language files on your computer

总之,这两个选项都已经过检查 enter image description here 在“高级标签”中,我选择了中文: enter image description here

步骤2在终端 /“命令窗口”中从光栅切换到中文字体

enter image description here

额外步骤3(可选)检查记事本中的字体

记事本对某些字体检查非常有用,例如打开temp.csv并使用字体,但要注意:Necessary criteria for fonts to be available in a command window

enter image description here

答案 1 :(得分:1)

显而易见的问题是Windows(一般来说)在处理UTF-8时存在问题。特别是命令行工具默认设置为特定于国家/地区的代码页而不是unicode。

通常可以通过将命令行会话的代码页设置为utf-8来(临时)修复它,例如键入:

chcp 65001

但问题是,在你的情况下,这并没有真正解决它,因为sqlite似乎仍然使用默认的字符集运行,并且似乎没有任何选项将当前的sqlite3会话设置为unicode。

首要的好消息是,您的数据是正确的,您可以使用sqlitemanager或类似的工具正确使用它,它们能够正确处理unicode。

进一步证实这一点:如果你用Excel打开原来的csv,它可能也会给你搞乱的字符(因为它通常不会默认为unicode)。而LibreOffice通常会要求您使用编码,并且给定unicode将显示正确的文本,但是给定不同的编码(例如:西欧等)会给您与excel相同的结果(您可以在那里预览它)很好,试一试。)

希望这有帮助!