免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: sunzhiguolu
打印 上一主题 下一主题

不能打印中文问题 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
11 [报告]
发表于 2016-09-09 11:51 |只看该作者
回复 10# 104359176
待处理的文本中包含了中文, 我对于 UTF8 的概念 还是未能搞懂.

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
12 [报告]
发表于 2016-09-17 11:44 |只看该作者
我在之前的设置可能有问题, 我修改了下:
我的终端环境:Options|Text->{Locale:C, Character Set:utf8}
.vimrc 配置为: :
set encoding=utf-8
:set fileencodings=utf-8,ucs-bom,gb2312,gbk
:set fileencoding=utf-8
:set termencoding=utf-8

我做了一个小测试,
cat text
------------------------------------
我非常喜欢 Perl 语言
同时也非常喜欢正则表达式

file -i text
------------------------------------
text: text/plain; charset=utf-8

我想将 text 中的文本输出成 gb2312 编码的文本, 但是将结果重定向到一个文件后 居然是乱码.
没有找到原因, 请大家指点一下, 谢谢大家...

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
13 [报告]
发表于 2016-09-17 11:57 |只看该作者
具体的代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. binmode (STDIN, ":encoding(utf8)");
  5. binmode (STDOUT, ":encoding(gb2312)");

  6. while (<>){
  7.     print;
  8. }
复制代码

执行后提示如下错误:
perl test.pl text>rst
------------------------------------------------
"\x{00e6}" does not map to euc-cn, <> line 2.
"\x{0088}" does not map to euc-cn, <> line 2.
"\x{0091}" does not map to euc-cn, <> line 2.
"\x{009d}" does not map to euc-cn, <> line 2.
"\x{009e}" does not map to euc-cn, <> line 2.
"\x{00e5}" does not map to euc-cn, <> line 2.
"\x{00b8}" does not map to euc-cn, <> line 2.
"\x{00b8}" does not map to euc-cn, <> line 2.
"\x{00e5}" does not map to euc-cn, <> line 2.
"\x{0096}" does not map to euc-cn, <> line 2.
"\x{009c}" does not map to euc-cn, <> line 2.
"\x{00e6}" does not map to euc-cn, <> line 2.
"\x{00ac}" does not map to euc-cn, <> line 2.
"\x{00a2}" does not map to euc-cn, <> line 2.
"\x{00af}" does not map to euc-cn, <> line 2.
"\x{00ad}" does not map to euc-cn, <> line 2.
"\x{0080}" does not map to euc-cn, <> line 2.
"\x{00e5}" does not map to euc-cn, <> line 2.
"\x{0090}" does not map to euc-cn, <> line 2.
"\x{008c}" does not map to euc-cn, <> line 2.
"\x{00e6}" does not map to euc-cn, <> line 2.
"\x{0097}" does not map to euc-cn, <> line 2.
"\x{00b6}" does not map to euc-cn, <> line 2.
"\x{00e4}" does not map to euc-cn, <> line 2.
"\x{00b9}" does not map to euc-cn, <> line 2.
"\x{009f}" does not map to euc-cn, <> line 2.
"\x{009d}" does not map to euc-cn, <> line 2.
"\x{009e}" does not map to euc-cn, <> line 2.
"\x{00e5}" does not map to euc-cn, <> line 2.
"\x{00b8}" does not map to euc-cn, <> line 2.
"\x{00b8}" does not map to euc-cn, <> line 2.
"\x{00e5}" does not map to euc-cn, <> line 2.
"\x{0096}" does not map to euc-cn, <> line 2.
"\x{009c}" does not map to euc-cn, <> line 2.
"\x{00e6}" does not map to euc-cn, <> line 2.
"\x{00ac}" does not map to euc-cn, <> line 2.
"\x{00a2}" does not map to euc-cn, <> line 2.
"\x{00e6}" does not map to euc-cn, <> line 2.
"\x{00ad}" does not map to euc-cn, <> line 2.
"\x{00a3}" does not map to euc-cn, <> line 2.
"\x{00e5}" does not map to euc-cn, <> line 2.
"\x{0088}" does not map to euc-cn, <> line 2.
"\x{0099}" does not map to euc-cn, <> line 2.
"\x{00a1}" does not map to euc-cn, <> line 2.
"\x{00be}" does not map to euc-cn, <> line 2.
"\x{00be}" does not map to euc-cn, <> line 2.
"\x{00e5}" does not map to euc-cn, <> line 2.
"\x{00bc}" does not map to euc-cn, <> line 2.
"\x{008f}" does not map to euc-cn, <> line 2.

file -i rst
----------------------------------------------
rst: text/plain; charset=iso-8859-1

cat rst
----------------------------------------------
\x{00e6}\x{0088}\x{0091}▒▒\x{009d}\x{009e}\x{00e5}\x{00b8}\x{00b8}\x{00e5}\x{0096}\x{009c}\x{00e6}\x{00ac}\x{00a2} Perl ▒▒\x{00af}\x{00ad}▒▒▒▒\x{0080}
\x{00e5}\x{0090}\x{008c}\x{00e6}\x{0097}\x{00b6}\x{00e4}\x{00b9}\x{009f}▒▒\x{009d}\x{009e}\x{00e5}\x{00b8}\x{00b8}\x{00e5}\x{0096}\x{009c}\x{00e6}\x{00ac}\x{00a2}\x{00e6}\x{00ad}\x{00a3}\x{00e5}\x{0088}\x{0099}▒▒\x{00a1}▒▒▒▒\x{00be}\x{00be}\x{00e5}\x{00bc}\x{008f}

在 Windows 环境打开依然是这个样子, 解决这个问题 我需要从那个地方着手, 谢谢大家...

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
14 [报告]
发表于 2016-09-17 11:59 |只看该作者
回复 8# 104359176
有关 utf8 测试终于通过了, 谢谢.
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;

  5. if (ord ("中") == 20013){
  6.     print "UTF8 Encoding.\n";
  7. }
复制代码



论坛徽章:
0
15 [报告]
发表于 2016-09-17 14:57 |只看该作者
本帖最后由 hztj2005 于 2016-09-23 23:58 编辑

我上次说的书,你还是买一本看。我尝终日而思,不如须臾之所学。

你首先要看读入文件究竟是那种编码格式,window下用记事本打开,点击另存为,在对话框最下面,编码下拉框中就可以知道当前究竟编码格式。简体中文系统下,其中的ANSI就是gb2312。另外一种就是utf-8。还有两种你现在不用关心。
如果对少数几个文件转换格式,你选定格式之后保存,就可以了,不用写代码。

要想写代码转换,先看我说的书。因为打字很麻烦,而且我是win10下面用ActivePerl,环境与你不同,交流比较麻烦。

   以下是网上文字:
     这几天工作中用到不少字符集,Unicode、utf-8、GB2312等,但是在windows命令行里敲notepad进入文本编辑页面。保存时需要选择编码方式,但是不存在GB,却有ANSI,于是纳闷,回来一查,才恍然大悟:原来在简体中文系统下,ANSI 编码代表 GB2312 编码。
  为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。
  不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
  不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
16 [报告]
发表于 2016-09-17 16:32 |只看该作者
回复 15# hztj2005
非常感谢大神您的热情回复, 我在处理文件前已经确认过文件的编码方式. 如下 text 的文件, 就是我读入的文件并且希望进行转换的源文件:



论坛徽章:
0
17 [报告]
发表于 2016-09-17 22:19 |只看该作者
注意下面代码要保存为ANSI格式,就可以运行了。

  1. #!/usr/bin/perl
  2. use Encode;
  3. use warnings;

  4. open (In, "<:encoding(UTF-8)","text.txt");
  5. open (Out,">textgb2312.txt");


  6. while (<In>){
  7.           chomp;
  8.           $Str = encode("gb2312",$_);
  9.        print Out "$Str\n";
  10. }


  11. exit;
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很受启发, 谢谢大神指点!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
18 [报告]
发表于 2016-09-18 11:13 |只看该作者
回复 17# hztj2005
非常感谢您的帮助, 非常有用! 我将先前的代码改写了下, 代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Encode qw (decode encode);

  5. while (<>){
  6.     chomp;
  7.     print encode ('gb2312', decode ('utf8', $_)), "\r\n";
  8. }

复制代码
perl test.pl text>rst
----------------------------------------------------------


我还想请教下大神, 先前我出错的原因在哪里, 还请再指点下, 谢谢!


论坛徽章:
0
19 [报告]
发表于 2016-09-20 16:22 |只看该作者
sunzhiguolu 发表于 2016-09-18 11:13
回复 17# hztj2005
非常感谢您的帮助, 非常有用! 我将先前的代码改写了下, 代码如下:
perl test.pl text ...
  1. <p>#use strict;
  2. binmode($ARGV[0], ":encoding(UTF-8)");
  3. binmode($ARGV[1], ":encoding(gb2312)");
  4. while (<>) {
  5. chomp;
  6. print $_."\n";
  7. }

  8. exit;</p><p>
  9. </p><p>这样可以运行。你的代码出错,也许是binmode对STDIN适用性不好。</p>
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP