当我指定char(从字面或其他形式)时,什么;java内部编码是UTF16“;这里是什么意思?它以什么编码方式存储在char中?

当我指定char(从字面或其他形式)时,什么;java内部编码是UTF16“;这里是什么意思?它以什么编码方式存储在char中?,java,character-encoding,char,Java,Character Encoding,Char,“java内部编码是UTF16”。在这场比赛中,哪里有意义 此外,我可以将一个utf16代码单元从代理范围(比如“\uD800”)完美地放入字符中,这使得这个字符完全无效。并且让我们停留在BMP中,以避免认为我们可能会有2个字符(代码单位)作为补充符号(这样想在我看来,“字符内部使用utf16”完全是胡说八道)。但也许“字符内部使用utf16”在BMP中有意义 如果是这样的话,我可以理解它:我的源代码文件是windows-1251编码的,字符文字根据windows-1251编码转换成数字(实际发

“java内部编码是UTF16”。在这场比赛中,哪里有意义

此外,我可以将一个utf16代码单元从代理范围(比如“\uD800”)完美地放入字符中,这使得这个字符完全无效。并且让我们停留在BMP中,以避免认为我们可能会有2个字符(代码单位)作为补充符号(这样想在我看来,“字符内部使用utf16”完全是胡说八道)。但也许“字符内部使用utf16”在BMP中有意义

如果是这样的话,我可以理解它:我的源代码文件是windows-1251编码的,字符文字根据windows-1251编码转换成数字(实际发生的情况),然后这个数字自动转换成另一个数字(从windows-1251数字到utf-16数字)-这不会发生(我说的对吗?!我可以理解为“内部使用UTF-16”)。然后,存储的数字被写入(实际上它是按照给定的方式写入的,从win-1251开始,没有发生我的“从内部utf16到输出\控制台编码的虚拟转换”),控制台显示它使用控制台编码从数字到字形的转换(实际发生的情况)

所以这个“内部使用的UTF16编码”无论如何都不会被使用???char只存储任何数字(在[0..65535]中),并且除了特定的范围外,“无符号”与int(当然在我的示例范围内)没有区别

另外,上面的代码是源文件和控制台输出的UTF-8编码

//non-utf source file encoding
char ch = 'ё'; // some number within 0..65535 is stored in char. 
System.out.println(ch); // the same number output to 
й
1081
在控制台输出中使用源文件的win-1251编码和UTF-8

//non-utf source file encoding
char ch = 'ё'; // some number within 0..65535 is stored in char. 
System.out.println(ch); // the same number output to 
й
1081
如果使用字符串而不是字符,则输出相同

�
65533
在API中,所有以char为参数的方法通常从不以编码为参数。但以byte[]为参数的方法通常将编码作为另一个参数。意味着使用char我们不需要编码(意味着我们肯定知道这种编码).但是**我们究竟如何知道在什么编码中,某些东西被放入了字符

如果char只是一个数字的存储,我们需要了解这个数字最初是从什么编码来的?***
所以char vs byte只是char有两个未知编码的字节(而不是一个字节的未知编码)。
给定一些已初始化的char变量,我们不知道要使用什么编码来正确显示它(要为输出选择正确的控制台编码),我们无法说出在使用char literal初始化时源文件的编码是什么(不包括各种编码和utf兼容的情况)

我是对的,还是我是个大白痴?很抱歉在后一种情况下问:)

因此,研究表明我的问题没有直接答案:


在大多数情况下,最好将
字符看作某个字符(独立于任何编码),例如字符“a”,而不是某些编码中的16位值。只有在
字符
字符串
与字节序列之间转换时,编码才起作用

一个
char
被内部编码为UTF-16的事实只有在您必须处理它的数值时才是重要的


代理项对仅在字符序列中有意义。单个
char
不能在BMP之外保存字符值。这就是字符抽象的问题所在。

在大多数情况下,最好将
char
视为特定字符(独立于任何编码),例如字符“a”,而不是某些编码中的16位值。只有在
字符
字符串
与字节序列之间转换时,编码才起作用

一个
char
被内部编码为UTF-16的事实只有在您必须处理它的数值时才是重要的


代理项对仅在字符序列中有意义。单个
char
不能在BMP之外保存字符值。这就是字符抽象的问题所在。

Unicode是一种将文本数据表示为代码点的系统。这些通常是字符,但并不总是。Unicode码点总是以某种编码方式表示。常见的是UTF-8、UTF-16和UTF-32,其中数字表示编码单元中的位数。(例如,UTF-8编码为8位字节,UTF-16编码为16位字。)

虽然Unicode的第一个版本只允许范围为0hex的代码点。。。FFFFhex,在Unicode 2.0中,他们将范围更改为0hex到10FFFFhex

因此,很明显,Java(16位)
char
不再足够大,无法表示每个Unicode代码点

这让我们回到UTF-16。Java
char
可以表示小于或等于FFFFhex的Unicode代码点。对于较大的码点,UTF-16表示由2个16位值组成;所谓的代理对。这将适合2个Java
char
s。因此,事实上,Java
字符串的标准表示形式是一系列
char
值,它们构成了Unicode代码点的UTF-16表示形式

如果我们使用的是大多数现代语言(包括带有简化字符的CJK),那么Unicode代码点都位于代码平面零(0hex到FFFFhex)。如果您可以做出这样的假设,那么可以将
char
视为Unicode码点。然而,我们越来越多地在更高的层面上看到代码点。常见的情况是Emojis的代码点。)

如果您查看Java文档中的
字符串
类,您将看到一系列方法行
codePointAt
codePointCount
等等。这些允许您处理文本数据