字符編碼那些事


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

相關文章
相關標籤/搜索