字符编码那些事


java char的述职范围 0-65535 超过的用两个长度的char数组(utf-16)表示
Character.toChars(0x4E2Df)php


你不能用一个单一的char(持有一个UTF-16代码单元)作到这一点
// This represents U+10FFFF
String x = "\udbff\udfff"; html

两个UTF-16代码单元结合在一块儿,造成超出基本多语言平面的单一Unicode代码点
String y = new StringBuilder().appendCodePoint(0x10ffff).toString();java

int x = 0x10FFFF;
String y = new String(Character.toChars(ch));web


notepad UCS-2 直接用两个字节存入字符的 Unicode 码, UCS-2用两个字节编码,UCS-4用4个字节编码json

Unicode的最大码位是0x10FFFFapi

UTF-16与UCS-2的关系
UTF-16可当作是UCS-2的父集。在没有辅助平面字符(surrogate code points)前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就称为UTF-16了。如今如有软件声称本身支援UCS-2编码,那实际上是暗指它不能支援在UTF-16中超过2bytes的字集。对于小于0x10000的UCS码,UTF-16编码就等于UCS码。数组

utf-16 用两个字节或四个字节表示,中间用到里代理,以更方便和unicode转换
unicode编码范围:0x0000~0x10FFFF,共17个面,但实际中只用了5个面oracle

0号面 bmp 用的最多app

 

unicode转换工具:http://tool.chinaz.com/tools/unicode.aspx ide

 

https://www.javacodex.com/Strings/Get-Unicode-Values-Of-A-String 

对于超过65535的unicode会有问题

public class StringUnicode { public static void main(String[] args) { String str = "abc ABC"; for (char c : str.toCharArray()) { System.out.printf("\\u%04x \n", (int) c); } } } 

 

java中获取字符的unicode值(适用于全部字符)

        String y = new String(Character.toChars(0x2B85B)); // code point转字符串
        System.out.println(y.codePointAt(0)); // 字符串转 code point

 

        String y1 = new StringBuilder().appendCodePoint(0x2B85B).toString(); // StringBuilder 也支持 code point
        System.out.println(y1);

 

        String x = "\uD86E\uDC5B";
        System.out.println(x);

 

        /**
         * char 不一样的赋值类型
         */
        //char c = '\u0061';
        //char c = 0x61;
        //char c = 97;
        char c = 'a';

        System.out.println(c);

 

php中unicode操做 

  Unicode codepoint 转译语法

  这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 能够接受任何有效的 codepoint,而且开头的 0 是能够省略的。

  

    public function test4(){

        echo "\u{aa}";
        echo "\u{0000aa}";
        echo "\u{9999}";

    }

 

须要扩展(国际化与字符编码)支持  https://secure.php.net/manual/zh/class.intlchar.php

    public function test4(){

        $values = ["A", 63, 123, 9731];
        foreach ($values as $value) {
            var_dump(IntlChar::chr($value));
        }
    }

 

 新增长的 IntlChar 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操做多字符集的 unicode 字符

<?php

printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

 

超过U+FFFF的码位也支持

        $a = "𫡛";
        $str = json_encode($a);
        var_dump($str);

        var_dump(json_decode($str));

        // output
        //  string(14) ""\ud86e\udc5b""
        //string(4) "𫡛"

 

 

// 您能够直接在PHP中对字符进行编码  二进制转义。该  转义语法也是 PHP 5支持
echo
("\xE3\x82\xA2");\x\x

 

 

 

UTF-8 使用一至四个字节为每一个字符编码,其中大部分汉字采用三个字节编码,少许不经常使用汉字采用四个字节编码。 

UTF-16 使用二或四个字节为每一个字符编码,其中大部分汉字采用两个字节编码,少许不经常使用汉字采用四个字节编码。 

 

Unicode 字符表示形式

char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾作过修改,以容许那些其表示形式须要超过 16 位的字符。合法代码点 的范围如今是从 U+0000 到 U+10FFFF,即一般所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。)

从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符Java 2 平台在 char 数组以及 StringStringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。

因此,char 值表示 Basic Multilingual Plane (BMP) 代码点,其中包括代理项代码点,或 UTF-16 编码的代码单元。int 值表示全部 Unicode 代码点,包括增补代码点。int 的 21 个低位(最低有效位)用于表示 Unicode 代码点,而且 11 个高位(最高有效位)必须为零。除非另有指定,不然与增补字符和代理项 char 值有关的行为以下:

  • 只接受一个 char 值的方法没法支持增补字符。它们将代理项字符范围内的 char 值视为未定义字符。例如,Character.isLetter('\uD840') 返回 false,即便是特定值,若是在字符串的后面跟着任何低代理项值,那么它将表示一个字母。
  • 接受一个 int 值的方法支持全部 Unicode 字符,其中包括增补字符。例如,Character.isLetter(0x2F81A) 返回 true,由于代码点值表示一个字母(一个 CJK 象形文字)。

在 Java SE API 文档中,Unicode 代码点 用于范围在 U+0000 与 U+10FFFF 之间的字符值,而 Unicode 代码点 用于做为 UTF-16 编码的代码单元的 16 位 char 值。有关 Unicode 技术的详细信息,请参阅 Unicode Glossary

参见:https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html#unicode

 

- A Java char takes always 16 bits.
- A Unicode character, when encoded as UTF-16, takes “almost always” (not always) 16 bits: that’s because there are more than 64K unicode characters. Hence, a Java char is NOT a Unicode character (though “almost always” is).
- “Almost always”, above, means the 64K first code points of Unicode, range 0x0000 to 0xFFF (BMP), which take 16 bits in the UTF-16 encoding.
- A non-BMP (“rare”) Unicode character is represented as two Java chars (surrogate representation). This applies also to the literal representation as a string: For example, the character U+20000 is written as “\uD840\uDC00”.
- Corolary: string.length() returns the number of java chars, not of Unicode chars. A string that has just one “rare” unicode character (eg U+20000) would return length() = 2 . Same consideration applies to any method that deals with char-sequences.
- Java has little intelligence for dealing with non-BMP unicode characters as a whole. There are some utility methods that treat characters as code-points, represented as ints eg: Character.isLetter(int ch). Those are the real fully-Unicode methods.

 

java中字符串以UTF-16编码格式对字符进行编码

大部分状况下一个char类型等同于该字符的unicode码值,但当unicode码值超过0xFFFF时,会采用两个char(utf-16编码,大端)来存储

由于一个char最大的值为 0xFFFF

 

参考文章:

  https://blog.csdn.net/u014631304/article/details/77509380

  http://www.fmddlmyy.cn/text16.html

  https://baike.baidu.com/item/Unicode/750500?fr=aladdin

   http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

   http://landcareweb.com/questions/2269/phpzi-fu-chuan-zhong-de-unicodezi-fu

相关文章
相关标签/搜索