Unicode字符编码规范,字符编码些许事

Friedhelm Hillebrand四十三虚岁的时候,他感觉前段时间手提式有线电话机短信1五拾伍个字符已经丰富使用,于是决定把那一个数字定为一条短信内容的字数上线。

有道翻译

用有道翻译的API来做示范,大家经过API获取单词"word"的汉译。

GET http://fanyi.youdao.com/openapi.do?keyfrom=WoxLauncher&key=1247918016&type=data&doctype=json&version=1.1&q=word

回去的JSON如下所示:

{
  "translation": [
    "词"
  ],
  "basic": {
    "us-phonetic": "wɝd",
    "phonetic": "wɜːd",
    "uk-phonetic": "wɜːd",
    "explains": [
      "n. [语] 单词;话语;消息;诺言;命令",
      "vt. 用言辞表达",
      "n. (Word)人名;(英)沃德"
    ]
  },
  "query": "word",
  "errorCode": 0,
  "web": [
    {
      "value": [
        "单词",
        "字",
        "字 (计算机)"
      ],
      "key": "word"
    },
    {
      "value": [
        "构词法",
        "造词法",
        "词性转换"
      ],
      "key": "Word Formation"
    },
    {
      "value": [
        "关键字",
        "中心词",
        "关键词"
      ],
      "key": "key word"
    }
  ]
}

再次回到的剧情包涵中文,从响应头大家得以看看重临的JSON使用了UTF-8编码:

图片 1

Paste_Image.png

用Wireshark抓包看看具体内容:

图片 2

Paste_Image.png

如上海教室所示,translation以此key对应的数组内容应该是"词",所以大家见到高亮区域的内容是22 E8 AF 8D 22,0x22对应ASCII字符",0xE8 0xAF 0x8D正是汉语的UTF-8编码。

 

知乎:什么是 7 位元的字符? 乌克兰(УКРАЇНА)语字符难道不是 8 bit 是多个字符?一条短信到底能容下 140 个希伯来语字符还是 160 个?

  6、进一步的参照他事他说加以考察资料
  本文首要参照的资料是 "Short overview of ISO-IEC 10646 and Unicode"
(

1陆13个阿拉伯语字符要用7位ASCII编码来举行表示,要求7*161个人。但是换来8位UCS-2编码表示,则须要7*160/8位。相同的时间,由于中文汉字须求占用2个字符,那样中文字符总量正是7*160/8/2,刚好等于70。

GB种类字符集

汉语景况下一旦要健康突显字符,仅依附ASCII字符集是不行的,由此大家国家制定了一多元的国家规范(GB),当中就包罗GB2312、GB12000、GBK、GB18030......,最新的正规化是GB18030,包涵70241个字符。

而短信公约支持7字位、8字位、16字位3种编码,7字位用于美利坚合众国,能够发送1五17个假名,8字位用于澳洲国家,16字位用于中国和东瀛韩俄等国家,使用UCS-2编码。而UCS-2把具备Unicode字符编码为2字节,所以就算波兰语字母也会编码成2个字节。

yskin:

  3、UCS-2、UCS-4、BMP

图片 3

基本功概念

  • 字符
    字符是各类文字和符号的总称,富含多个国家家文字、标点符号、图形符号、数字等,乃至还是可以回顾无法出示的字符(举例ASCII规范定义了1三十多少个字符,个中35个字符不能够显示)。
  • 字符集
    为了使Computer能够管理字符新闻,首先要调节选拔哪些字符。那样就变成了二个凑合,或然说八个表,称为字符表(character repertoire)。当然,也足以感觉那便是贰个字符集(character set)。
    比方,将全体的葡萄牙共和国语字母放在一块儿得以组成二个字符集,将具有的汉字放在一块儿得以整合叁个字符集,等等。
  • 编码字符集
    对二个字符聚焦的有着字符实行编号,这种编号后的字符集叫做编码字符集(这里的编码仅仅指编号,分歧于下文中的编码)。常见的编码字符集有ASCII、Unicode、GBK等。

能够那样来驾驭:字符串是由字符构成,字符在管理器硬件中经过二进制情势积存,这种二进制格局正是编码。借使直接使用 “字符串️字符️二进制表示(编码)” ,会追加差别连串编码之间调换的复杂性。所以引进了叁个抽象层,“字符串️字符️与存款和储蓄毫无干系的代表️二进制表示(编码)” ,那样就足以用一种与存款和储蓄非亲非故的款式表示字符,不一样的编码之间转换时可以先转移到那些抽象层,然后再转变为别的编码情势。
比方:Unicode 正是 “与存储毫不相关的代表”,UTF-8 便是 “二进制表示”。

比方,输入六公斤个普通话,上面展现70/70,再加三个时上边展现“71/134(2短音信)”。输入1六二十个保加利亚共和国语,下边展现160/160,再加四个人作品展现“16四分之一06(2短音信)”。

 

  读者可以用记事本测量检验一下我们的编码是还是不是精确。

P.S 对于从未接纳过功效机的人来讲,大概直接都不亮堂原本短信是有字数限制的。重返和讯,查看越来越多

举多少个栗子

/*************************************************/

再有本人的手提式有线电话机怎么是最多 150 个捷克语字母?那是 7.5 位元的编码格局吗?

  问题二:
  近期在英特网看见一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8那三种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这几个编码方式,小编本来就明白。但以此顺序让自家稍稍零乱,想不起来UTF-16和UCS2有如何关联。
查了查相关资料,总算将那几个难点弄掌握了,顺带也了然了有的Unicode的细节。写成一篇小说,送给有过类似难题的爱侣。本文在撰文时尽只怕做到简单明了,但须要读者掌握什么样是字节,什么是十六进制。

图片 4

自身不想写一篇大而全的篇章,也无力去搜求那么多材质包罗全体知识点,倘使想明白越来越多音信,这里有几篇小编认为写得没有错的篇章可以提供参照他事他说加以考察,本文也许有个别借鉴了内部的原委。

 

 

  GB18030一定于是GBK的超集,比GBK包蕴的字符更加多。据笔者所知近来还未曾操作系统直接匡助GB18030。

她立刻利用一台打字机随便打出一些由字母组成的音讯,令人离奇的是,那么些音讯每一条都以唯有一两行,何况总字数也不会抢先1伍18个,160便成为她以为到颇负神奇的数字。

Unicode字符集

Unicode字符集由多语言软件创立商组成的统一码结盟(Unicode Consortium)与国标化协会的ISO-10646工作组拟定,为各样语言中的每一种字符钦定统一且独一的代码点,以满足跨语言、跨平台转变和拍卖文件的渴求。中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的有的 Unicode方今大范围使用的是UCS-2编码,它用四个字节来编码贰个字符, 比方汉字"一"的编码是0x4E00。事实上Unicode对汉字援助不怎么好,那也是不能够的,简体和目不暇接总共有六陆万个汉字,而UCS-2最多能表示655叁拾四个,所以Unicode只可以排除有的差相当的少不用的汉字,万幸GB2312字符聚集常用的简体汉字也可是6761个,为了能表示具备汉字,Unicode也可能有UCS-4标准,正是用 4个字节来编码字符。

Unicode代码点范围为0x00x10FFFF,共计1114112个代码点,划分为编号016的14个字符平面,每一个平面包蕴655叁二十一个代码点。个中编号为0的平面最为常用,称为基本多语种平面(Basic Multilingual Plane, BMP);其余平面则称为帮忙语言平面。

为了描述三个代码点,能够选取U加十六进制整数的格局。比方,U+0041意味着韩语大写字母A,U+4E00表示汉字”一”。

知乎:什么是 7 位元的字符? 拉脱维亚语字符难道不是 8 bit 是三个字符?一条短信到底能容下 140 个葡萄牙共和国语字符依然 160 个?

选取139邮箱做测验,里面发送短信无论怎么样字符都是以UCS-2编码,当输入1叁12个字符时,展现将按3条短信计费。别的,表达里还关系,最八只可以援助350字的短信。

  在DBCS中,GB内码的蕴藏格式始终是big endian,即高位在前。

对编制程序技巧有所领会的同桌知道,由于字符本人使用编码格局的不及,最后将招致字符个数的不及。对于克罗地亚(Croatia)语字母来讲,日常采取7位ASCII编码,中文则为8位UCS-2编码,供给占用2个字节。

UTF-32

UTF-32选用代码点等值转换法,将各样代码点编码为1个32bit的编码单元(四字节),因而空间功效极低,不比别的Unicode编码应用分布。

假设短信当先长度,那么系统就自动分成多条短信来发。因为要投入一些标记性字符以代表顺序,所以俄文每条154个,普通话每条69个。接收方假使是新一点的无绳话机就能把这几条合併后出示给顾客,老一点的手提式有线电话机就能独家展现每条短信。

 

  UTF-16以十三个人为单元对UCS举办编码。对于小于0x一千0的UCS码,UTF-16编码就等于UCS码对应的十三人无符号整数。对于比非常大于0x一千0的UCS码,定义了三个算法。可是是因为实在应用的UCS2,也许UCS4的BMP必然小于0x一千0,所以就近日来说,能够认为UTF-16和UCS-2基本同样。但UCS-2只是一个编码方案,UTF-16却要用于实际的传导,所以就只好思量字节序的难点。

趁着短信本领的前进,各流年营商也混乱把1五18个字符作为单条短信的上线。

UTF-8

UTF-8最大的多本个性,正是它是一种变长的编码方式。它能够行使1~4个字节表示叁个符号,依据不一致的标志而变化字节长度,当字符在ASCII 码的界定期,就用三个字节表示,保留了ASCII字符八个字节的编码做为它的一部分,注意的是Unicode六当中文字符占2个字节,而UTF-8二个普通话字符占3个字节)。从Unicode到UTF-8并非平昔的应和,而是要过部分算法和准则来改动。

Unicode符号范围(十六进制) UTF-8编码方式(二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

举个例证:
抑或用中文“一”,其Unicode值为0x4E00,落在0800-FFFF的范围内,事实上普通话基本上都在那么些区域。0x4E00的二进制表示为0100111000000000,转变到UTF-8就是11100100 10111000一千0000,对应的十六进制表示是0xE4 0xB8 0x80。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.tsh.sms.MainActivity" >

    <TextView
        android:id="@+id/tv_input_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/input_tel_number" />

    <EditText
        android:id="@+id/et_number"
        android:singleLine="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/tv_input_number"
        android:ems="10"
        android:inputType="phone" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/tv_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/et_number"
        android:text="@string/sms_content" />

    <EditText
        android:id="@+id/et_content"
        android:lines="5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/tv_number"
        android:ems="10" />

    <Button
        android:id="@+id/bt_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/et_content"
        android:text="@string/send" />

</RelativeLayout>

一经短信超越长度,那么系统就自动分成多条短信来发。因为要投入一些标志性字符以表示顺序,所以爱尔兰语每条1伍拾个,中文每条六15个。接收方如若是新一点的无绳电话机就能把这几条合併后出示给客商,老一点的无绳话机就能够独家突显每条短信。

  这3套编码标准都利用了多个扩展ASCII的点子,因而,几套编码互不包容,何况编码区间也各有分化

网编:

编码

有关编码格局,当然能够动用类似ASCII字符集的编码形式——代码点等值转变法(这是作者本身起的名字)。既然Unicode代码点的值的限定是0~0x10FFF,那么能够用三个21bit的编码单元来编码,直接把代码点等值调换来21bit的二进制种类。

可是那存在二个上空应用的难点,比方对于利用俄文的人来说,ASCII基本得以满意使用。倘诺运用ASCII码,只要求1个字节来存款和储蓄字符,然而若选用刚才的笔触,要求临近3个字节来积累,那眼看是荒废空间的。

假诺须要支持的字符集再少一些,仅辅助理编辑号0的平面,那最少也许有655三十三个字符,须求16bit的上空(2字节)来存款和储蓄一个字符,即UCS-2编码,这种编码用来储存ASCII字符也是一种浪费。

Unicode在不短一段时间内不可能推广,直到互连网的出现,为消除Unicode怎样在互联网上传输的标题,于是面向传输的众多 UTF(UCS Transfer Format)规范出现了,看名就能够知道意思,UTF-8便是每便8个位传输数据,而UTF-16正是历次14个位。UTF-8正是在互联英特网应用最广的一种Unicode的落到实处形式,那是为传输而设计的编码,并使编码无国界,那样就能够显得环球上保有知识的字符了。

 

/*************************************************/

  由于历史的案由,在Unicode从前,一共存在过3套普通话编码标准。

用过作用机的小同伴们都会清楚,每一条短信的字数被限制在七19个汉字,超越之后就能够被拆分为2条短信发送。

ASCII字符集

常备说的ASCII字符集不包罗增添集,只有1三十个字符,由此其编码的存放只须求利用7个bit,三个字节丰富了高高的位长久都以0。比如字符'0',其代码是十六进制的0x30,二进制表示为001一千0。

这里说个和ASCII字符集有关的编码方案,GSM标准合同规定单条短信最多存款和储蓄1叁十几个字节的剧情,假如短信内容只富含ASCII字符,因为ASCII字符的数额第四位必定是0,所以GSM标准中明显了7bit编码的短信格式,只用7个bit来连接存款和储蓄ASCII字符,那样原本1三十多少个8bit的存款和储蓄空间,就可以积累159个7bit的数据。假使什么人今后手上还会有NOKIA手提式有线电话机,能够拿起来看看只富含ASCII字符的短信是或不是能够输入1五十七个字符,假使短信中隐含了非ASCII字符(举个例子普通话),那么全体字符都会成为双字节积存的编码(UCS-2编码),一条短信的剧情就过来成只可以发送70个字符。现近期的智能手提式有线电话机繁多都支持短信拼接,并非说单条短信的体积扩展了,而是将你编写的超过常规单条短信体量的短信分成多条发送,运转商也是按多条短信计的。

一则短信能够容纳140字节,也正是约1伍15个7位元的字符、或是1四十多个8-bit的字符,普通话字、意大利语字与英文字那么些占2-byte的字符则可容纳七贰11个。(使用Unicode系统)。这一个不富含额外的连串情报。

举例说,输入七二十一个汉语,上边呈现70/70,再加三个时下边呈现“71/134(2短新闻)”。输入1陆12个印度语印尼语,上面呈现160/160,再加二个显得“1650%06(2短新闻)”。

  GB2312的原稿照旧区位码,从区位码到内码,须要在高字节和低字节上各自拉长A0。

那正是为何运行商规定单条短信的汉字限制为六18个的因由。

  • 《字符编码的故事:ASCII,GB2312,Unicode,UTF-8,UTF-16》
  • 《unicode,ansi,utf-8,unicodebigendian编码的区分》

 

  1. 拖动控件的话编写翻译器自动加的layout_blow=”@+id/xxx” id那么些部分从没+号
    Ctrl+f批量替换
    EditText展现的行数android:singleLine="true"一行, android:lines="5" 多行
    模拟器超时原因 Computer配置低,修改超时时间,模拟器socket挂了,重启一下
    短信api SmsManager倘诺过时,导包的难题gsm 2G时代的,要是三个类不能new对象,那么它自然存在一个getDefaut可能getInstance的静态方法

  2. SmsManager的方法
    sendDataMessage(发送彩信)
    sendMultipartTextMessage(发送多条新闻),
    sendTextMessage(目的手提式有线电话机, null(来源手提式有线电话机不支持), text, sentIntent, deliveryIntent)后三个参数,延迟报告和送达报告,不关怀填null
    内需那么些权力 android.permission.SEND_SMS

  “endian”这么些词出自《Gulliver游记》。小人国的国内大战就源于吃鸡蛋时是毕竟从大洋(Big-Endian)敲开依然从小头(Little-Endian)敲开,由此曾产生过七遍叛乱,在那之中多个天王送了命,另贰个丢了皇位。

实质上,是有历史由来的。

ONE·一个

本条API是通过抓包抓出来的,哪个人让她们不走https呢?

GET http://v3.wufazhuce.com:8000/api/reading/index

回去数据太多,仅截取一小段进展深入分析。

{
  "res": 0,
  "data": {
    "essay": [
      {
        "content_id": "2176",
        "hp_title": "软糖| “白日梦” _ 初夏的味道",
        "hp_makettime": "2017-04-03 06:00:00",
        "guide_word": "我们每周会选择一个主题,由七个作者绘制不同风格的短篇漫画,每天一幅。",
        "start_video": "",
        "author": [
          {
            "user_id": "7742828",
            "user_name": "双麒_宋 ",
            "desc": "因爱而画,美好的作品产生于最压抑的欲望。",
            "wb_name": "",
            "is_settled": "0",
            "settled_type": "0",
            "summary": "因爱而画,美好的作品产生于最压抑的欲望。",
            "fans_total": "574",
            "web_url": "http://image.wufazhuce.com/FoPpyeue8ajoRlZ4Fy39a56o4NO-"
          }
        ],
    ......
    }
......
}

回来的剧情包含汉语,但从响应头大家看不到重临的JSON使用了什么编码格式:

图片 5

Paste_Image.png

用Wireshark抓包看看具体内容:

图片 6

Paste_Image.png

如上海体育场地所示,这些API央求重返的JSON数据输出的是普通话的Unicode转义字符,那实际也是JS对中文的正规化处理格局,推测后台或然是NodeJS完毕的。

自家是咕咕鸡,贰个还在不停学习的全栈程序猿。
热爱生活,喜欢跑步,家庭是本身不断迈进发展的重力。

layout代码

package com.tsh.sms;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
    private EditText et_number;
    private EditText et_content;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt_send=(Button) findViewById(R.id.bt_send);
        et_number=(EditText) findViewById(R.id.et_number);
        et_content=(EditText) findViewById(R.id.et_content);
        bt_send.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_send:
            String number=et_number.getText().toString().trim();
            String content=et_content.getText().toString().trim();
            if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){
                Toast.makeText(this, "电话号码和内容都不能为空", Toast.LENGTH_SHORT).show();
                return;
            }
            SmsManager smsManager=SmsManager.getDefault();
            ArrayList<String> contents = smsManager.divideMessage(content);
            for(String str:contents){
                smsManager.sendTextMessage(number, null, str, null, null);
            }

            break;
        }
    }
}

  5、UTF的字节序和BOM
  UTF-8以字节为编码单元,没有字节序的主题材料。UTF-16以八个字节为编码单元,在讲解三个UTF-16文本前,首先要弄通晓每一个编码单元的字节序。举例收到贰个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。假若我们收到UTF-16字节流“594E”,那么那是“奎”照旧“乙”?

原标题:手提式有线电话机短信为啥要限制陆二十个汉字?中兴发短信有字数限制吗?

工具推荐

此地有个网站提供的转码效果十分好,比起一些站长工具更专门的学问。

图片 7

Paste_Image.png

上海体育场合是使用该网址物色中文字符“一”的结果,能够看出其Unicode值为U+4E00,UTF-8编码为0xE4 0xB8 0x80,在U福睿斯L中供给转码为%E4%B8%80,在js脚本中则是\u4e00......。

/*****************2016年4月23日 更新********************************/

一则短信能够容纳140字节,约等于约1陆十二个7位元的字符、或是1叁19个8-bit的字符,中文字、希腊语字与朝鲜语字这一个占2-byte的字符则可容纳六12个。(使用Unicode系统)。那几个不包括额外的系统情报。

  比如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以必要求用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1一千1 001001, 用这几个比特流依次取代模板中的x,获得:11100110 101壹仟1 10001001,即E6 B1 89。

缘由要追溯到上世纪80年间,Friedhelm Hillebrand是前几日手提式有线电话机短信才能的主发明人,陆13个汉字(1五17个罗马尼亚(România)语字符)正是她引起的。

UTF-16

UTF-16的编码单元是16bit,对于每种代码点,选择1个也许2个编码单元来表示,因而那是贰个变长表示。

activity代码:

/*****************2016年4月23日 更新********************************/

  UTF-8没有须要BOM来评释字节顺序,但足以用BOM来申明编码形式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者能够用大家日前介绍的编码方法验证一下)。所以一旦接收者收到以EF BB
BF开端的字节流,就驾驭那是UTF-8编码了。

何以要限制在陆十二个汉字?多安装一点不佳吧?

再有自个儿的无绳电话机怎么是最多 150 个德语字母?那是 7.5 位元的编码情势吗?

layout代码

  UTF-8正是以8位为单元对UCS举行编码。从UCS-2到UTF-8的编码格局如下:

7位元字符便是指规范ASCII去掉最高位的0。以这种格局张开编码,在U.S.这样的国家,发送的短信字符都以ASCII码表里的,所以没供给浪费一个字位。

而短信公约扶助7字位、8字位、16字位3种编码,7字位用于United States,能够发送156个假名,8字位用于南美洲国家,16字位用于中国和日本韩俄等国家,使用UCS-2编码。而UCS-2把装有Unicode字符编码为2字节,所以即使保加利亚语字母也会编码成2个字节。

  UCS-2编码(16进制) UTF-8 字节流(二进制)
  0000 - 007F 0xxxxxxx
  0080 - 07FF 110xxxxx 10xxxxxx
  0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

相关文章