我想在Perl中读取UTF-8输入,无论它来自标准输入还是来自文件,使用菱形运算符:while(<>){...}.
所以我的脚本应该像往常一样以这两种方式调用,给出相同的输出:
./script.pl utf8.txt
cat utf8.txt | ./script.pl
Run Code Online (Sandbox Code Playgroud)
但产出不同!只有第二次调用(使用cat)似乎按设计工作,正确读取UTF-8.这是脚本:
#!/usr/bin/perl -w
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
while(<>){
my @chars = split //, $_;
print "$_\n" foreach(@chars);
}
Run Code Online (Sandbox Code Playgroud)
在两种情况下如何才能正确读取UTF-8?<>如果可能的话,我想继续使用钻石操作员进行阅读.
编辑:
我意识到我应该描述不同的输出.我的输入文件包含以下序列:a\xCA\xA7b.cat正确输出的方法:
a
\xCA\xA7
b
Run Code Online (Sandbox Code Playgroud)
但另一种方法给了我这个:
a
\xC3\x8A
\xC2\xA7
b
Run Code Online (Sandbox Code Playgroud) 以下是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>
Run Code Online (Sandbox Code Playgroud)
为什么相同的sqlite命令可以在sqlitemanager中正确显示?
如何设置在sqlite控制台中显示中文字符?

在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', …Run Code Online (Sandbox Code Playgroud)