优三帝同学

上善若水,人淡如菊

嗨,我是优三帝 (@onevcat),一名 Unity 开发者。


欢迎访问我的博客~

Perl中JSON的解析和utf-8乱码的解决

最近在做一个带有网络通讯和同步功能的app,需要自己写一些后台的东西。因为是半路入门,所以从事开发以来就没有做过后台相关的工作,属于绝对的小白菜鸟。而因为公司在入职前给新员工提过学习Perl的要求,所以还算是稍微看过一些。这次的后台也直接就用Perl来写了。

基本使用

和app的通讯,很大程度上依赖了JSON,一来是熟悉,二来是iOS现在解析JSON也十分方便。iOS客户端的话JSON的解析和生成都是没什么问题的:iOS5中加入了NSJSONSerialization类来提供相关功能,如果希望支持更早的系统版本的话,相关的开源代码也有很多,也简单易用,比如SBJson或者JSONKit。同样,在Perl里也有不少类似的JSON处理的模块,最有名最早的应该是JSON模块了,同时也简单易用,应该可以满足大部分情况下的需求了。

使用也很简单,安装完模块后,use之后使用encode_json命令即可将perl的array或者dic转换为标准的JSON字符串了:

use JSON qw/encode_json decode_json/;
my $data = [
    {
        'name' => 'Ken',
        'age' => 19
    },
    {
        'name' => 'Ken',
        'age' => 25
    }
];
my $json_out = encode_json($data);

得到的字符串为

[{"name":"Ken","age":19},{"name":"Ken","age":25}]

相对应地,解析也很容易

my $array = decode_json($json_out);

得到的$array是含有两个字典的数组的ref。

UTF-8乱码解决

在数据中含有UTF-8字符的时候需要稍微注意,如果直接按照上面的方法将会出现乱码。JSON模块的encode_json和decode_json自身是支持UTF8编码的,但是perl为了简洁高效,默认是认为程序是非UTF8的,因此在程序开头处需要申明需要UTF8支持。另外,如果需要用到JSON编码的功能(即encode_json)的话,还需要加入Encode模块的支持。总之,在程序开始处加入以下:

use utf8;
use Encode;

另外,如果使用非UTF8进行编码的内容的话,最好先使用Encode的from_to命令转换成UTF8,之后再进行JSON编码。比如使用GBK编码的简体字(一般来自比较早的Windows的文件等会偶尔变成非UTF8编码),先进性如下转换:

use JSON;
use Encode 'from_to';
 
# 假设$json是GBK编码的
my $json = '{"test" : "我是GBK编码的哦"}';
 
from_to($json, 'GBK', 'UTF-8');
 
my $data = decode_json($json);

其他的,如果追求更高的JSON转换性能的话,可以试试看JSON::XS之类的附加模块~

Buy me a coffeeBuy me a coffee
最近的文章

Unity 3D中的内存管理

本文欢迎转载,但烦请保留此行出处信息:http://www.onevcat.com/2012/11/memory-in-unity3d/Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验。类似这种情况并不少见,但是绝大部分都是可以避免的。虽然理论上Unity的内存管理系统应当为开发者分忧解难,让大家投身到更有意义的事情中去,但是对于Unity对内存的管理方式,官方文档中并没有太多的说明,基本需要...…

能工巧匠集继续阅读
更早的文章

再见,祖国

这篇日志发送的时候,我应该已经在离开中国的飞机上了,也有可能已经到达异国他乡了。这是一次不知道归期的旅途,也是一次充满未知的探索,从现在开始,祝自己好运。我在中国待了二十六载春秋,对这片土地有着深厚的感情。无论何时何地,无论此去经年,这个经历了太多磨难和挫折并且面临着巨大挑战的国家,始终是我魂牵梦萦的地方。虽然还有各种问题,虽然不足和缺点明显到让人无力吐槽,但是这个国家是我的祖国。对于自己的国家,一个人是没有任何理由和立场去厌恶的。记得本科入学式的时候,校长有这样一句话:“你们来到这里,是...…

碎碎念继续阅读