免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4285 | 回复: 5
打印 上一主题 下一主题

Mojolicious 中的中文问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-19 10:09 |只看该作者 |倒序浏览
写了一个网页,用于查询区号对应的省份名字。
有2个资源文件,一个是存储“区号”和“省份名”对应的txt文档,文件的编码格式是utf8;另外一个是mojo程序文档,也是utf-8编码。
2个文件在vi 中通过 set fileencoding 查看,都是utf-8的。

在mojo程序中,我设置了网页内容是utf8
$self->res->headers->header('Content-Type' => 'text/html;charset=utf-8');
并且在html中也设置了网页编码也是utf-8
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

当用户输入区号名之后,会去读取txt文档,找到对应的省份名,然后展示给用户,但是用户看到的却是乱码。
网页中有其他中文字符,却是可以正常显示的,

求原因?

论坛徽章:
0
2 [报告]
发表于 2014-02-19 15:52 |只看该作者
本帖最后由 youzhengchuan 于 2014-02-19 15:59 编辑

看来这种不怎么热的东西,还是要自己摸索,解决方法如下:
1: 引用 “Mojo::ByteStream”
2:读取类容之后,需要进行UTF-8的解码。(不知道为什么需要解码,因为文本内容原本就是UTF-8的。可能是mojo会自行再做一次UTF-8的编码吧,所以如果原类容是UTF-8的,那么mojo输出之后,就等于多做了一次UTF-8编码。)
     可以看这个连接”https://github.com/kraih/mojo/wiki/Utf-8-manipulation“,在这里讲如何使用UTF-8,我就是在这里看到了”Mojo::ByteStream“函数。

  1. use Mojo::ByteStream;

  2. get '/' => sub {
  3.   my $self = shift;
  4.   my $file_utf8 = "/var/www/mojo/app-characterset/Mojolicious-utf8.txt";
  5.   my @content = ();
  6.   if(open FILE,$file_utf8){
  7.     while(<FILE>){
  8.       chomp;
  9.       my $stream = Mojo::ByteStream->new($_);
  10.       my $utf8 = $stream->decode('UTF-8');
  11.       push @content , $utf8;
  12.     }
  13.     $self->stash(content => [@content]);
  14.   }
  15. } => 'index';

  16. app->start;
  17. __DATA__

  18. @@ index.html.ep
  19. <!DOCTYPE html>
  20. <html>
  21. <head>
  22.   <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
  23. <head/>
  24. <body>

  25. <%= link_to 'Back to index/' => '/' %>.<br/>
  26. <b>is content blow.<b/><br/><br/>

  27.     % foreach ( @$content ){
  28.     %   chomp;
  29.         <%= $_ %><br/>
  30.     % }

  31. <body/>
  32. <html/>
复制代码

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
3 [报告]
发表于 2014-02-19 16:33 |只看该作者
多做一次编码为什么就可以了?
还有,不需要知道源文本的编码格式,就可以直接转成UTF-8?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2014-02-20 08:10 |只看该作者
LZ应该把这些写到startup中,应用启动的时候就加载这些文件到内存中,而不是在route中做

论坛徽章:
0
5 [报告]
发表于 2014-02-20 14:29 |只看该作者
遇到同样的问题,我的是从数据库中读出的中文,显示到模板中就乱码了。需要decode('utf8', $string) 才能正常显示,但是总不能每个字符串都decode一下吧。。

奇怪的是,在模板 "问题" == $string, 竟然返回true(假设string的内容是乱码的"问题"二字)

论坛徽章:
0
6 [报告]
发表于 2014-02-20 15:16 |只看该作者
我的问题找到了,DBI连接时设置mysql_enable_utf8 => 1即可
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP