搜索
查看: 1302|回复: 9

请教aardio和python3的编码问题

[复制链接]

1

主题

4

帖子

35

积分

新手入门

Rank: 1

积分
35
发表于 2018-5-31 11:18:14 | 显示全部楼层 |阅读模式
最近在阅读aardio帮助文档和代码段的python范例,对于aardio和Python3的编码有点不理解

aardio代码段-->文件编码差别,有如下注释
  1. Python3里的bytes在aardio中转换为buffer(即字节数组),
  2. 而Python3里的字符串内部是UTF8,跟aardio一致不需要转换,
  3. 包括python的代码文件都是UTF8编码,跟aardio完全一致。
复制代码


在aardio代码段-->注释和字符串中
  1. wstr = u"ptyhon3里字符串默认为unicode,所以这个u前缀就没有意义了,在aardio里u需要写到单引号后面" "\n"
复制代码



Python3的字符串是Unicode,这个毫无疑问,而在aardio中字符串是utf-8,两者应该不一样吧
Python3中Unicode转换为utf-8,必须用到 encode函数。
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-5-31 14:21:08 | 显示全部楼层
“毫无疑问” 你就不会发这个帖子了,
python返回的字符串是UTF8编码,跟aardio一致,所以你不再需要转换。

python基础知识请自行了解,先区分python中的字符串、字节数组。
aardio已经提供了很多调用python的范例,多动手实测,不要停于猜测:
import console;
import py;

var pyCode = /**
def getPythonString():
    return '包含中文的str'
**/


//执行Python3 的代码
py.exec( pyCode )

//获取Python字符串
console.log( py.main.getPythonString() )
console.log( string.isUtf8(
tostring( py.main.getPythonString() )  ) )

console.pause()



回复

使用道具 举报

4

主题

63

帖子

485

积分

二级会员

Rank: 3Rank: 3

积分
485
发表于 2018-5-31 14:37:48 | 显示全部楼层
引用知乎某用户的回答
简单来说:
Unicode 是「字符集」
UTF-8 是「编码规则」
回复

使用道具 举报

1

主题

4

帖子

35

积分

新手入门

Rank: 1

积分
35
 楼主| 发表于 2018-6-1 07:37:29 | 显示全部楼层
Jacen.He 发表于 2018-5-31 14:21
“毫无疑问” 你就不会发这个帖子了,
python返回的字符串是UTF8编码,跟aardio一致,所以你不再需要转换 ...

Python3的字符串默认是unicode,没有指定任何编码,python的帮助文档也有说明,在内存中存入unicode码点
  1. A string is a sequence of values that represent Unicode code points.
复制代码


aardio的字符串默认指定了编码,utf-8

  1. import console;

  2. var str = '中'
  3. // “中” 的 unicode 码点是 20013
  4. // 用utf-8表示是b'\xe4\xb8\xad'
  5. // e4 换算成十进制是 228

  6. console.log(str[1])  //  取第一个字节为228,说明str采用的是utf-8编码

  7. console.pause();
复制代码



帮助文档中说明 string.toUnicode(),是utf-8到utf-16之间转换,其实也有问题,应该是utf-8到unicode转换,将utf-8字节换成unicode码点。如果按帮助文档所说 toUnicdoe,是utf-8到utf-16,那么aardio的字符串处理也很糟糕。utf-16编码被称为unicode编码,本身就是带有很大的混淆性,当然这是历史问题,严谨点的逻辑,应该就是unicode就是uncode,unicode没有指定编码方式

  1. import console;

  2. var str = '中'

  3. console.log(str[1])
  4. console.log(string.toUnicode(str)[1])  // 输出20013,如果str被转换成了utf-16编码,那么[1]也应该是取第一个字节

  5. console.pause();
复制代码
回复

使用道具 举报

1

主题

4

帖子

35

积分

新手入门

Rank: 1

积分
35
 楼主| 发表于 2018-6-1 07:38:39 | 显示全部楼层
我心飞翔1995 发表于 2018-5-31 14:37
引用知乎某用户的回答
简单来说:
Unicode 是「字符集」

嗯嗯,我找到了这篇文章,读了一下,大致明白了。谢谢回复哈
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-6-1 09:21:27 | 显示全部楼层
ICGo 发表于 2018-6-1 07:37
Python3的字符串默认是unicode,没有指定任何编码,python的帮助文档也有说明,在内存中存入unicode码点
...

能不能虚心一点?!
什么都不懂,就一脸自我陶醉的这个毫无疑问,那个错了很糟糕。
我说过少猜测,多动手实测,上面已经发了代码你应该先动手试一下。

谁跟你说的 Unicode 不是编码方式?!又是谁跟你说的 UTF-16 不是Unicode呢 ?
至少先查一下 Unicode 这个词本身是什么意思,再来长篇大论的批判历史。

UTF-16是直接以Unicode编码,所以一般Unicode是特指UTF-16,
以编程语言为例C语言、C++语言里Unicode 都是指的 UTF-16,以普通软件为例,例如系统记事本,另存为的编码方式列出来的就是UTF-8、Unicode ......这些 。

一个词用到哪里要看上下文,这相当于你硬要说“蜗牛”不是牛而是错误和混乱,这不叫严谨,这是在秀智商下限。
回复

使用道具 举报

1

主题

4

帖子

35

积分

新手入门

Rank: 1

积分
35
 楼主| 发表于 2018-6-1 09:24:52 | 显示全部楼层
Jacen.He 发表于 2018-6-1 09:21
能不能虚心一点?!
什么都不懂,就一脸自我陶醉的这个毫无疑问,那个错了很糟糕。
我说过少猜测,多动 ...

好吧,你说的对,就这样,真实可笑。,混乱的要命
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-6-1 09:33:43 | 显示全部楼层
我心飞翔1995 发表于 2018-5-31 14:37
引用知乎某用户的回答
简单来说:
Unicode 是「字符集」


你这个说法是有问题的,
字符集本身也是指定了一套编码规则,Unicode 这个词就是统一编码的意思。

在写网页的时候,就是用 charset="UTF-8" 指定字符集为UTF-8,
或者你可以打开系统注册表,系统字符集里就有"UTF-8","Unicode"这些。

没事多写一些代码,自然就知道是怎么回事了,
只有无知才会去纠结“蜗牛其实不是牛”这种无聊的问题。
回复

使用道具 举报

4

主题

63

帖子

485

积分

二级会员

Rank: 3Rank: 3

积分
485
发表于 2018-6-1 09:56:42 | 显示全部楼层
的确,死抠字眼很容易变得无聊,网上找到的这篇博客也很好地解决了不了解的其他部分。
字符编码:Unicode和UTF-8之间的关系 - CSDN博客
https://blog.csdn.net/xiaolei1021/article/details/52093706
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-6-1 14:32:53 | 显示全部楼层
我心飞翔1995 发表于 2018-6-1 09:56
的确,死抠字眼很容易变得无聊,网上找到的这篇博客也很好地解决了不了解的其他部分。
字符编码:Unicode ...

抠字眼没问题,但要抠对地方。
我说的是Python字符串虚拟机 内部 接口、还有 文件源代码 里这些底层的地方字符串都是用UTF8编码,上面我也给了测试代码可以很明显的看出Python内部接口传入传出字符串用的是UTF8编码。

他完全误读了我的意思,Python的Unicode字符串只有转换为bytes才涉及编码的概念,但是这不等于他在内存里不用编码,“不用编码不是编码没有任何编码” 是个什么东东呢?!码点不编码怎么存储在内存里?!

可以看一下Python解释器源代码里一个Unicode字符串是长这样的:
typedef struct {
    PyASCIIObject _base;
    Py_ssize_t utf8_length;
    char *utf8;
    Py_ssize_t wstr_length;
} PyCompactUnicodeObject;

typedef struct {
    PyCompactUnicodeObject _base;
    union {
        void *any;
        Py_UCS1 *latin1;
        Py_UCS2 *ucs2;
        Py_UCS4 *ucs4;
    } data;
} PyUnicodeObject;
可以看到Python字符串根据需要使用不同的Unicode编码存储在内存里,例如UTF-8,UTF-16(UCS2)这些,而不是楼主所说的“没有任何编码”。当然,如果一个Unicode概念都能把他脑子搞混乱的人,我觉得去跟他讲Python的源码也没有什么意义。

目前操作系统、包括在C,C++这种基础的编程语言里,Unicode字符串实际上都是使用UTF-16,而UTF8字符串是在Unicode的基础上再编码了一次,也就是说UTF8是基于Unicode的变体,所以UTF8要转换回到Unicode(UTF-16)需要有一次转换过程,这个待遇跟其他ANSI编码是一样的。


回复

使用道具 举报

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

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-18 00:27 , Processed in 0.078125 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表