Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

基本类型里面是否去掉char或者改成32位 #95

Open
freeonsky opened this issue May 18, 2021 · 4 comments
Open

基本类型里面是否去掉char或者改成32位 #95

freeonsky opened this issue May 18, 2021 · 4 comments
Labels
enhancement New feature or request
Milestone

Comments

@freeonsky
Copy link

freeonsky commented May 18, 2021

文档里面有char这个基本类型,一般char用来表示一个字符,但是char只有16位,是不足以完整表示一个字符的,一个u32/i32 才能完整存储一个字符。是否去掉char类型,直接用i32。或者保留char, 像rust一样,char改成32位。

最早的unicode版本收录的字符少,16位就够了,后面unicode已经有100万+字符了,16位完全不够。这个时候,用16位的char就完全不够了。改成32位是一个比较好的选择

@freeonsky
Copy link
Author

freeonsky commented May 18, 2021

golang的处理方式: string就是utf8字节数组,如果想单独处理string中的某个字符,需要将string转成 rune数组, rune就是32位;

java由于出现比较早,有char类型,但是java的char类型并不能完整标识一个字符,于是java在String里面提供codePointAt 方法,返回一个int类型,用来标识一个字符

@freeonsky freeonsky changed the title 基本类型里面是否去掉char 基本类型里面是否去掉char或者改成32位 May 18, 2021
@chinesebear
Copy link
Contributor

已经收到您的问题,deeplang设计组正在讨论解决方案。

@freeonsky
Copy link
Author

编程语言字符、字符串设计

unicode字符集已经超过100万,每个字符用16位bit来存储是不够的,如果用32bit,又有些浪费。
流行语言的处理方式:

  1. java
    java有char类型,16bit, java 的String 是char数组。java 的String 采用 utf-16 bigendian编码方式,有些字符超出unicode 基本字符集,就需要两个char来表示。
    所以用String 的length方法得到的不是字符的数量,而是char的数量,codePoints方法才能得到字符数量;访问字符串中的某个字符需要用 codePointAt 方法。
    java 的 String 不可修改

  2. golang
    golang的 string 是一个 8bit数组,采用utf8编码的字节数组。如果想要处理单个字符,需要将string转成 rune数组,rune是32bit,足以表示任意unicode字符。

  3. rust
    rust的str 也是utf8字节数组,不过rust的str不支持index方法(比如str[0] 方法), 需要将str转成 char数组才可以(str.chars),rust的char是32位。

可以看到rust,golang这两个最近出现的语言,一个字符都是用32bit表示。平常使用的字符串则使用8bit数组,使用utf8编码的字节数组。

@chinesebear
Copy link
Contributor

编程语言字符、字符串设计

unicode字符集已经超过100万,每个字符用16位bit来存储是不够的,如果用32bit,又有些浪费。
流行语言的处理方式:

  1. java
    java有char类型,16bit, java 的String 是char数组。java 的String 采用 utf-16 bigendian编码方式,有些字符超出unicode 基本字符集,就需要两个char来表示。
    所以用String 的length方法得到的不是字符的数量,而是char的数量,codePoints方法才能得到字符数量;访问字符串中的某个字符需要用 codePointAt 方法。
    java 的 String 不可修改
  2. golang
    golang的 string 是一个 8bit数组,采用utf8编码的字节数组。如果想要处理单个字符,需要将string转成 rune数组,rune是32bit,足以表示任意unicode字符。
  3. rust
    rust的str 也是utf8字节数组,不过rust的str不支持index方法(比如str[0] 方法), 需要将str转成 char数组才可以(str.chars),rust的char是32位。

可以看到rust,golang这两个最近出现的语言,一个字符都是用32bit表示。平常使用的字符串则使用8bit数组,使用utf8编码的字节数组。

非常感谢你的分析。关于字符串的设计,deeplang社区有几个提案正在讨论,因为涉及到前端以及后端的设计,是一个纵向的feature,需要多些时间做仔细的设计。

@chinesebear chinesebear added the enhancement New feature or request label Jun 27, 2021
@chinesebear chinesebear added this to the Deeplang 0.2 milestone Jun 27, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants