字符在内存中最终的表示形式是什么?是某种字符编码还是码位(Code Point)?

根据我的了解,编码中有三个核心概念:
1. 字符集(Character Set),可以说是一个抽象概念,字符的合集
2. 码位(Code Point),将抽象的字符集中每一个字符映射到一个整数
3. 字符编码(Encoding),按照某种编码规则用二进制来表示一个字符

我对码位这个概念理解的不是很清楚,Code point中说:

The notion of a code point is used for abstraction, to distinguish both:

  • the number from an encoding as a sequence of bits, and
  • the abstract character from a particular graphical representation (glyph).

This is because one may wish to make these distinctions:

  • encode a particular code space in different ways, or
  • display a character via different glyphs.

说Code Point是用于抽象,但Java中依然可以使用codePointAt方法来获取实际的整数值

    String str = "JAVA";
System.out.println("String = " + str); // codepoint at index 1
int retval = str.codePointAt(1); // prints character at index1 in string
System.out.println("Character(unicode point) = " + retval);

用Java的String来举例子,引用自深入分析 Java 中的中文编码问题

String str = “I am 君山”;

String 内部的char 数组的值为 49 20 61 6d 20 541b 5c71

请问这char数组的值是码位吗,还是说是JVM使用的UTF16的编码?

字符在内存中最终的表示形式是什么?是不是和具体编程语言相关?

 
code point是protocol,encoding是内存格式。这就像Unicode与UTF-32的区别一样。
 
 

林威建敲代码的,java迷,在校生

  1. 在现代编码模型里要知道一个字符如何映射成计算机里比特,需要经过如下几个步骤。

    1. 知道一个系统需要支持哪些字符,这些字符的集合被称为字符表(Character repertoire)
    2. 给字符表里的抽象字符编上一个数字,也就是字符集合到一个整数集合的映射。这种映射称为编码字符集(CCS:Coded Character Set),unicode是属于这一层的概念,跟计算机里的什么进制啊没有任何关系,它是完全数学的抽象的。
    3. 将CCS里字符对应的整数转换成有限长度的比特值,便于以后计算机使用一定长度的二进制形式表示该整数。这个对应关系被称为字符编码表(CEF:Character Encoding Form)UTF-8, UTF-16都属于这层。
    4. 对于CEF得到的比特值具体如何在计算机中进行存储,传输。因为存在大端小端的问题,这就会跟具体的操作系统相关了。这种解决方案称为字符编码方案(CES:Character Encoding Scheme)。

    平常我们所说的编码都在第三步的时候完成了,都没有涉及到CES。

    以上摘自(http://blog.jobbole.com/39309/

    unicode只是一种抽象概念,使用一个数字来表示字符集中的一个字符,相当于规定了unicode字符集中那一百多万个字符和数字的映射,代码点就相当于这个字符对应着的数字了。Java中采用UTF-16编码方式对unicode进行表示(unicode是一种抽象概念,只确定了字符和码位的映射关系,不管编码),就是字符串的编码是utf-16,题主的例子中很清楚了。

    注意char类型16位,单个char肯定无法表示这一百多万个码位的,一但字符串中出现了char无法表示的码位(字符)的时候,这时候就用utf-16进行编码,用多个char表示这个码位,相应字符串的length方法也比字符要多(length是char数组的长度),用charat方法也不一定能获得那个字符,而要用codepointat方法获得那个位置所在的字符的unicode码位,我记得还有一个codepointsize方法,可以获得具体的(码位)字符数。

    再次强调一下,这个码位表示的是一个整数,是unicode编码里规定的某个字符想对应的整数。

    所幸大多数常用字符都能用一个char类型表示,所以一般length方法都能确定字符串中字符的个数,但这个方式看起来不是那么可靠,所以不是处理英文的地方,算字符数量的时候,还是考虑不要用length了吧。

    以上。

    手机码字,求指正错误。

张焱凯我的鲨鱼~也来自深海~~

感觉题主对字符编码已经理解的非常清楚了,不过我不知道题主说“我对码位这个概念理解的不是很清楚”是指哪里?

关于Java String的内存表示问题,题主说的那个内部char数组是UTF16码,而不是Unicode Code Point。其实Java里面的char本来就都是UTF16码,Unicode Code Point的数字范围已经超出char类型的范围了。

字符串对象在内存中的表示形式,不同语言确实有些许差异,不过大致只有两类:

一类是像C这种比较原始(raw)、比较底层、比较直接的语言,基本就是把你的源文件里面的那几个代表字符的字节原封不动的编译到可执行文件中,然后加载到内存中。所以这种情况下,字符串对象在内存中的表示形式,直接就是按你源文件的编码来的。

另一类是像Java、Python3之类的比较高级一点的语言,字符串对象在内存中通常是用UTF16表示的。

不过Python2情况还稍微复杂点,它有两种字符串对象,一种是UnicodeObject,另一种是StringObject。区别就是前者相当于Java String,后者相当于C char*。

现在C/C++中也有两种字符类型,一种是传统的char,另一种是宽字符wchar_t,这个跟Python2的情况比较类似。不过严格来说wchar_t的具体宽度是取决于不同编译器的实现的。GCC的实现貌似是32位,不知道是什么编码。VC应该是16位,采用UTF16编码。

字符在内存中最终的表示形式是什么?是某种字符编码还是码位(Code Point)?的更多相关文章

  1. JavaScript中的变量在内存中的具体存储形式

    栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...

  2. 论C/C++数据在内存中的二进制存放形式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010518429/article/details/30332237 // enter any ty ...

  3. 001. Java内存中的字符编码

    Java内存中的字符编码 Unicode字符集及utf-8 .utf-16.utf-32 等字符编码方式 字符集:字符表示的数字集合,元素称为码点或码位: 字符编码:字符实际的储存表示: 码点:一个码 ...

  4. C语言中字符型,整数型,浮点型在内存中如何存储

    ···void main() { unsigned char a = 97; printf("%p",&a); printf("%c,%d\n", a, ...

  5. C语言strchr()函数:查找某字符在字符串中首次出现的位置

    头文件:#include <string.h> strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:    char * strchr (const char *str, ...

  6. C/C++数据在内存中的存储方式

    目录 1 内存地址 2 内存空间   在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍. 本文是学 ...

  7. PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式

    目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...

  8. PJzhang:如何缓解Mimikatz从Windows2008 R2内存中读取域控密码?

    猫宁!!! 参考: https://xz.aliyun.com/t/4180 https://www.anquanke.com/post/id/156299 https://www.cnblogs.c ...

  9. Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功(转)

    ./configure CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld --host=arm-linux --prefix=/usr/loca ...

随机推荐

  1. python学习【第八篇】python模块

    模块与包 模块的概念 在python中一个.py文件就是一个模块. 使用模块可以提高代码的可维护性. 模块分为三种: python标准库 第三方模块 自定义模块 模块的导入方法 1.import语句 ...

  2. Python 内置函数、作用域、闭包、递归

    一.内置函数如何使用 help()一下: 如想看min()咋用?在shell中:help(min) 二.部分内置函数 (一).排序:sorted() li = [(1, 2, 3, 4), (7, 8 ...

  3. MySQL-库的操作

    05-库的操作   本节重点: 掌握库的增删改查   一.系统数据库 执行如下命令,查看系统库 show databases; nformation_schema: 虚拟库,不占用磁盘空间,存储的是数 ...

  4. css,查询相应标签,div等

    1.类名 .类别 例子: 查询类名为“useradd” .useradd{ margin-top:50px; margin-left:200px;} 2.属性找 例子:查询类为useradd下的inp ...

  5. 段合并 segments merge 被删除的文档的删除时间

    2.5 段合并 每个索引分为多个“写一次,读多次”的段 write once and read many times  segments 建立索引时,一个段写入磁盘以后就不能更新:被删除的文档的信息存 ...

  6. java集合的部分接口

    接口 Collection<E> public interface Collection<E>extends Iterable<E> Collection 层次结构 ...

  7. pycharm中导入自写模块时,模块下出现红线

    问题描述: 在pycharm中导入自己写的模块时,得不到智能提示,并在模块名下出现下红线,但是代码可以执行,错误提示为下图所示: 原因:出现 以上情况,是因为文件目录设置的问题,pycharm中的最上 ...

  8. python 里安装 tensorflow 后运行出错的问题解决

    如果出现一下错误: libcublas.so.8.0: cannot open shared object file: No such file or directory 原因是没有 cuda 环境, ...

  9. 高可用Redis服务架构分析与搭建(单redis实例)

    原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...

  10. 我的第三个Python小程序

    99乘法表: # Author: fansik # Description: 99 times table # method 1 num1 = 0 num2 = 0 while num1 < 9 ...