Chinaunix

标题: 请问“\ud83d\ude3d”这是什么字符? [打印本页]

作者: freeand    时间: 2012-10-13 15:56
标题: 请问“\ud83d\ude3d”这是什么字符?
本帖最后由 freeand 于 2012-10-13 16:40 编辑

编码码是:\ud83d\ude3d 在网页上看到并复制粘贴到论坛编辑器时看到的是:   发帖后变成:😽

经perl处理后:
  1. my $text = '\ud83d\ude3d';
  2. $text =~ s/\\u([0-9a-fA-F]{4})/pack("U",hex($1))/eg;
  3. $text = encode( "utf8", $text );
  4. printf  "$text\n";
复制代码
输出:

乱码?

有什么办法转成正常的utf8字符?

作者: sjdy521    时间: 2012-10-13 18:34
  1. perldoc perlre
复制代码
Escape sequences

作者: freeand    时间: 2012-10-13 19:42
sjdy521 发表于 2012-10-13 18:34


跟这个没关系吧?

http://www.charbase.com/1f63d-unicode-kissing-cat-face-with-closed-eyes
IE浏览器下两个“口口”,Firefox看到的和我上面发的图片一样,就像“1F63D”这几个字符。
作者: sjdy521    时间: 2012-10-13 19:45
这是perl板块啊
作者: freeand    时间: 2012-10-13 19:53
sjdy521 发表于 2012-10-13 19:45
这是perl板块啊


是啊,问题就是用perl来做unicode转utf8的问题啊。
一般中文的unicode代码pack后可以正常转成utf8格式。但 \ud83d\ude3d 转成后无论是显示还存保存在utf8格式的文件里,都是那几个“乱码”。
  1. my $text = '\u4f60';
  2. $text =~ s/\\u([0-9a-fA-F]{4})/pack("U",hex($1))/eg;
  3. $text = encode( "utf8", $text );
  4. printf  "$text\n";
复制代码
结果:你

作者: jason680    时间: 2012-10-13 22:01
本帖最后由 jason680 于 2012-10-14 10:46 编辑

回复 1# freeand


    \ud83d \ude3d  ==> utf-16

http://www.russellcottrell.com/g ... ePairCalculator.htm
    Enter a hexadecimal Unicode surrogate pair (D800-DBFF and DC00-DFFF):
    d83d + de3d = 1F63D (utf-32)  😽

Note: 😽 it will be a graphic like as an animal "cat",
but 😽 (utf-32) can't show on this page

作者: freeand    时间: 2012-10-13 23:55
本帖最后由 freeand 于 2012-10-14 00:00 编辑

回复 6# jason680

是这样了,和我之前发的那个链接相关。
我用Firefox 1.5,IE 8都没法显示那个表情,似乎要修改一下系统的注册表。

现在比较关心的不是显示,而是它能不能转成UTF8的形式保下来。按以上的办法转成UTF8(错码?乱码?)保存后,再也恢复不成 \ud83d\ude3d 了。


作者: jason680    时间: 2012-10-14 10:31
回复 7# freeand

$ cat unicode.pl

use strict;
use warnings;

use Encode;

my $text = '\ud83d\ude3d';
$text =~ s/\\u(d[89ab]..)\\u(d[c-f]..)/
  pack("U",0x10000 + (hex($1)-0xD800)*0x400 + hex($2)-0xDC00)/egx;
$text =~ s/\\u([0-9a-fA-F]{4})/pack("U",hex($1))/eg;

# please refer http://perldoc.perl.org/perlunicode.html
# or use 'perldoc perlunicode' and search 0x10000
# $uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);


$text = encode( "utf8", $text );
print "$text\n";

   
作者: sjdy521    时间: 2012-10-14 12:35
你为啥一定要纠结在\ud83d\ude3d上呢 这不是perl语言的unicode表示方式吧,
  1. use Encode qw/encode/;print encode "utf8","\N{U+1F63D}"
复制代码

作者: freeand    时间: 2012-10-14 12:38
jason680 发表于 2012-10-14 10:31
回复 7# freeand

$ cat unicode.pl


十分感谢!
unicode的转换处理简单又复杂。
作者: freeand    时间: 2012-10-14 12:58
回复 9# sjdy521

谢谢。是这样的,一个数据源里的格式全是 \uxxxx 形式的,我想转成直观的中文字符,里面正好包含一些非中文如“\ud83d\ude3d”这些,转过来时就破坏了。

我不是纠结这个,类似的CAT FACE编码不止一个,其它的类似问题的编码也可能会有,所以想了解并解决。

另外,那 1F63D 如何编码 \ud83d\ude3d 得来的?


   
作者: sjdy521    时间: 2012-10-14 21:25
回复 11# freeand


    surrogate 前面人已经说过了
作者: aaxron    时间: 2012-10-19 18:15
😽


iconv
作者: 只爱睡觉    时间: 2012-10-19 18:39
unicode而已。。
作者: cdtits    时间: 2012-10-21 18:54
貌似 unicode 字符集




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2