对于IDEA中default encoding for properties file和transparent native-to-ascii conversion的理解

关于default encoding for properties file

对于properties文件有两个设置,一个是左边下拉框选encoding字符集,默认的是iso8859-1编码和解码,先不勾选右边的transparent native-to-ascii-conversion。如果这时选了别的encoding编码集,那么读取的时候解码仍然是按照iso8859-1(只变编码不管解码,很坑!),就肯定会出现乱码。
对于IDEA中default encoding for properties file和transparent native-to-ascii conversion的理解_第1张图片

那么直接用默认的iso8859-1编码可以吗?依然是不行的,iso8859-1是单字节编码,自身不支持编码中文,编码表如下可以看出没有中文
对于IDEA中default encoding for properties file和transparent native-to-ascii conversion的理解_第2张图片

关于transparent native-to-ascii conversion

这个时候就要勾选旁边的transparent native-to-ascii-conversion,它的作用是在输入iso8859-1中没有定义的字符时(如汉字)他会自动的转换为Unicode编码,然后在读取的时候(如在idea中打开文件时)他会自动转回文字来显示。
也就是说它直接用unicode字符集的某一种字符编码(utf-8、utf-16或者utf-32)进行编解码,unicode可以支持所有语言的字符,对于特殊字符的编解码忽视你之前选择的default encoding for properties file,至于其他的字符是按照哪个编解码就不知道了。
这里都是个人理解可以参照官网解释:官方解释

关于unicode, utf-8, utf-16

Unicode

unicode是国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。
字符集的编码范围是 0x0000 - 0x10FFFF , 可以容纳一百多万个字符, 每个字符都有一个独一无二的编码,也即每个字符都有一个二进制数值和它对应,这里的二进制数值也叫 码点 。
比如:汉字 “中” 的 码点是 0x4E2D, 大写字母 A 的码点是 0x41, 具体字符对应的 Unicode 编码可以查询

字符集和字符编码

字符集是很多个字符的集合,例如 GB2312 是简体中文的字符集,它收录了六千多个常用的简体汉字及一些符号,数字,拼音等字符,unicode也是字符集。

字符编码是 字符集的一种实现方式,把字符集中的字符映射为特定的字节或字节序列,它是一种规则。

比如:Unicode 只是字符集,UTF-8、UTF-16、UTF-32 才是真正的字符编码规则。GB2312 既表示字符集,也代表字符编码,因为他只有一种编码方式(个人理解)。

Unicode 字符存储

Unicode 是一个字符集, 它只规定了每个符号的二进制值,但是符号具体如何存储它并没有规定,即字符编码有多种。

前面提到, Unicode 字符集的编码范围是 0x0000 - 0x10FFFF,因此需要 1 到 3 个字节来表示

那么,对于三个字节的 Unicode字符,计算机怎么知道它表示的是一个字符而不是三个字符呢 ?

如果所有字符都用三个字节表示,那么对于那些一个字节就能表示的字符来说,有两个字节是无意义的,对于存储来说,这是极大的浪费,假如 , 一个普通的文本, 大部分字符都只需一个字节就能表示,现在如果需要三个字节才能表示,文本的大小会大出三倍左右

因此,Unicode 出现了多种存储方式,常见的有 UTF-8、UTF-16、UTF-32,它们分别用不同的二进制格式来表示 Unicode 字符

UTF-8、UTF-16、UTF-32 中的 “UTF” 是 “Unicode Transformation Format” 的缩写,意思是"Unicode 转换格式",后面的数字表明至少使用多少个比特位来存储字符, 比如:UTF-8 最少需要8个比特位也就是一个字节来存储,对应的,UTF-16 和 UTF-32 分别需要最少 2 个字节 和 4 个字节来存储。有关utf-8,utf-16,utf-32和bom可以参考Unicode、UTF-8、UTF-16 终于懂了

你可能感兴趣的:(intellij-idea,java,ide)