java - 当我分配 char (从文字或其他方式)时, "java internal encoding is UTF16"在这里意味着什么? char是以什么编码存储的?

标签 java character-encoding char

//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 

“java内部编码是UTF16”。它在哪里有意义地发挥作用?

此外,我可以完美地将代理范围(例如“\uD800”)中的字符一个 utf16 代码单元放入其中 - 使该字符完全无效 Unicode让我们保持在 BMP 范围内,这样就可以避免认为我们可能有 2 个字符(代码单元)作为补充符号(这种想法对我来说听起来“char 内部使用 utf16”完全是无稽之谈)。但是也许“char内部使用utf16”在BMP中有意义?

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

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

附注实验上,上面的代码使用 UTF-8 编码源文件和控制台输出

й
1081

源文件的 win-1251 编码和控制台输出中的 UTF-8

�
65533

如果我们使用字符串而不是字符,输出相同...

String s = "й";
System.out.println(s);

在 API 中,所有以 char 作为参数的方法通常从不以编码作为参数。但是以 byte[] 作为参数的方法通常将编码作为另一个参数。这意味着对于 char 我们不需要编码(意味着我们肯定知道这种编码)。但是**我们到底如何知道什么编码被放入 char 中???

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

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

SO 研究没有直接回答我的问题:

最佳答案

在大多数情况下,最好将 char 视为某个字符(独立于任何编码),例如字符“A”,而不是某些编码中的 16 位值。仅当您在 charString 与字节序列之间进行转换时,编码才会发挥作用。

事实上,char 在内部编码为 UTF-16 仅当您必须处理它的数值时才重要。

代理对仅在字符序列中有意义。单个 char 不能保存 BMP 之外的字符值。这就是字符抽象崩溃的地方。

关于java - 当我分配 char (从文字或其他方式)时, "java internal encoding is UTF16"在这里意味着什么? char是以什么编码存储的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44520209/

相关文章:

Delphi:ADOConnection、DBASE3 和字符集(错误?)

mysql - 如何找出 MySQL 中的默认字符集/排序规则

c - 在以下 C 程序中,如果条件不起作用

c++ - 迭代过程命名

java - 什么时候创建/销毁常量字符串?

java - 如何将父bean的所有属性复制到子bean?

java - .java 文件中的包使类文件不可用

java - 显示 java GUI 时出现问题。它不会显示。我还是个新人,也许包类有问题或者其他什么问题

javascript - 如何使用 nodejs-iconv 模块(或其他解决方案)在 nodejs javascript 中将字符编码从 CP932 转换为 UTF-8

c++ - 在 C/C++(ms) 中将 char[] 转换为 tchar[] 的最简单方法是什么?