研究字符串转Unicode额外2个字节的来源

Python 基础-字符串和编码 UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。 阅读详情
论坛的讨论地址如下:
http://topic.youkuaiyun.com/u/20081009/09/e899898c-591f-4985-ae88-5972475708fb.html


测试代码如下:
  1.    String s = "1";
  2.     byte[] arr = s.getBytes("UNICODE");
  3.     System.out.println(Arrays.toString(arr)); // 12
感谢 runshine的精到和 lky5387、火龙果、 accp206的精彩讲解。


7楼
为了在读取字节时能知道所采用的字节序,在传输时采用了一个名为
 “ZERO WIDTH NON-BREAKING SPACE”(U+FEFF)的字符用于限定字节序,
开头两个字节为 FE FF 时为 Big-Endian,为 FF FE 时为 Little-Endian。
详见 RFC2781 3.2 节。

在 Java 中直接使用 Unicode 转码时会按照 UTF-16LE 的方式拆分,并加上 BOM。

如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分。


11楼
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。

(Unicode是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。)

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议在传输字节流前,先传输字 符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
在 Java 中直接使用Unicode 转码时会按照UTF-16LE 的方式拆分,并加上 BOM。 如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分。 (其实Unicode与UTF-8是完全一样的)


12楼
2个疑问,

1 为何UTF-8没有
2 我想知道,在源代码里的哪个部分做的这个判断。


19楼
引用 11 楼 lky5387 的回复:
其实Unicode与UTF-8是完全一样的

嗯,UTF-8 是通过 Unicode 转换而来的,是 Unicode 的表现形式之一。


引用 12 楼 java2000_net 的回复:
2个疑问,

1 为何UTF-8没有
2 我想知道,在源代码里的哪个部分做的这个判断。

只能回答你第一个问题:

UTF-8 是采用 1~4 个字节来表示 Unicode 字符的,每个 Unicode 的 UTF-8 编码的
第一个字节是有一定范围的,如果读取到某个字节的最高位为 0 那么采用一个字节表
示,如果最高位是两个“1”就采用两个字节表示,最高位是三个“1”采用三个字节表
示,以此类推。多字节表示时,第二个和后面的字节的最高位只能是“10”,也就是说
UTF-8 编码时字符的第一个字节的最高位不可能是“10”。

因此,UTF-8 只能采用 Big-Endian 的 BOM 方式。BOM 头 U+FEFF,UTF-8 编码为 EF BB BF
就稳含掉了。

如果采用 LE 方式时,字节序颠倒了,第一个字节最高位就是“10”了,这时 UTF-8 读
取时会产生错误,这时会采用一个被称为 Replacement Character (U+FFFD) 的字符来代替。

第二个问题正在看源代码……


24楼

java.lang.String#getBytes(String) 的源代码:
  1. public byte[] getBytes(String s) throws UnsupportedEncodingException {
  2.     if(s == null)
  3.         throw new NullPointerException();
  4.     else
  5.         return StringCoding.encode(s, value, offset, count);
  6. }

java.lang.StringCoding.encode 的源代码:
   
static byte [] encode(String s, char ac[], int i, int j) throws UnsupportedEncodingException {
Object obj
= (StringEncoder)deref(encoder);
String s1
= s != null ? s : " ISO-8859-1 " ;
if (obj == null || ! s1.equals(((StringEncoder) (obj)).requestedCharsetName()) && ! s1.equals(((StringEncoder) (obj)).charsetName())) {
obj
= null ;
try {
Charset charset
= lookupCharset(s1);
if (charset != null )
obj
= new CharsetSE(charset, s1);
}
catch (IllegalCharsetNameException illegalcharsetnameexception) { }
if (obj == null )
obj
= new ConverterSE(CharToByteConverter.getConverter(s1), s1);
set(encoder, obj);
}
return ((StringEncoder) (obj)).encode(ac, i, j);
}

Unicode 编码不存在对应的 Charset 因此会执行 new ConverterSE(CharToByteConverter.getConverter(s1), s1);
这一句。再通过其底层类库的字符集类 sun.io.CharacterEncoding 可以找出 Unicode 的转换器,
是采用 sun.io.CharToByteUnicode 这个类的,这个类的 sun.io 包是读取 file.encoding.pkg 这
个系统属性拼接字符串反射而来的。

这个类是这样拼出来的:
    file.encoding.pkg 属性值 + "." + "CharToByte" + CharacterEncoding 中保存的名字

这个类的构造是:
   
public CharToByteUnicode() {
usesMark
= true ;
markWritten
= false ;
byteOrder
= 0 ;
String s
= (String)AccessController.doPrivileged( new GetPropertyAction( " sun.io.unicode.encoding " , " UnicodeBig " ));
if (s.equals( " UnicodeBig " ))
byteOrder
= 1 ;
else
if (s.equals( " UnicodeLittle " ))
byteOrder
= 2 ;
else
byteOrder
= 1 ;
}

String s = (String)AccessController.doPrivileged(new GetPropertyAction("sun.io.unicode.encoding", "UnicodeBig"));
这一句很关键,决定着 Unicode 编码时 byteOrder 的值是 1 还是 2。这里有个 sun.io.unicode.encoding
这个系统属性,在 Windows 系统下的值为:UnicodeLittle,因此 byteOrder 值为 2。

注:有苹果机的同学用 System.out.println(System.getProperty("sun.io.unicode.encoding")); 看看这个值
是啥。

至于 Unicode 是怎么转换的看看 sun.io.CharToByteUnicode 这个类的源代码就有了。


25楼
果子继续,我想知道那个 -2 从哪里来的!
我只看到了2


27楼, 果子有点“生气”了,哈哈
汗,已经说了很清楚了啊,在 sun.io.CharToByteUnicode 这个类中啊。

贴上源代码吧。

Java code
   
01 public int convert( char ac[], int i, int j, byte abyte0[], int k, int l) throws ConversionBufferFullException, MalformedInputException {
02 charOff = i;
03 byteOff = k;
04 if (i >= j)
05 return 0 ;
06 int i1 = i;
07 int j1 = k;
08 int k1 = l - 2 ;
09 if (usesMark && ! markWritten) {
10 if (j1 > k1)
11 throw new ConversionBufferFullException();
12 if (byteOrder == 1 ) {
13 abyte0[j1 ++ ] = - 2 ;
14 abyte0[j1 ++ ] = - 1 ;
15 } else {
16 abyte0[j1 ++ ] = - 1 ;
17 abyte0[j1 ++ ] = - 2 ;
18 }
19 markWritten = true ;
20 }
21 if (byteOrder == 1 )
22 while (i1 < j) {
23 if (j1 > k1) {
24 charOff = i1;
25 byteOff = j1;
26 throw new ConversionBufferFullException();
27 }
28 char c = ac[i1 ++ ];
29 abyte0[j1 ++ ] = ( byte )(c >> 8 );
30 abyte0[j1 ++ ] = ( byte )(c & 255 );
31 }
32 else
33 while (i1 < j) {
34 if (j1 > k1) {
35 charOff = i1;
36 byteOff = j1;
37 throw new ConversionBufferFullException();
38 }
39 char c1 = ac[i1 ++ ];
40 abyte0[j1 ++ ] = ( byte )(c1 & 255 );
41 abyte0[j1 ++ ] = ( byte )(c1 >> 8 );
42 }
43 charOff = i1;
44 byteOff = j1;
45 return j1 - k;
46 }



12 判断字节序,13~14 行写入 BE 的 BOM;16~17 行写入 LE 的 BOM。

22~31 以 BE 方式写入字节,33~42 以 LE 方式写入字节。
BE 和 LE 的写入方式仅在 29~30 和 40~41 行不同。

29~30 为 BE 序先写入高字节,再写入低字节,而 40~41 为 LE 序,先写低字节,再写高字节的。


28楼
关于 Unicode 转为 byte 数组,做了个小实验,呵呵。
   
public class Test1 {

private final static char [] HEX = " 0123456789abcdef " .toCharArray();

public static void main(String[] args) throws UnsupportedEncodingException {
String str
= " 中国 " ;
String[] encoding
= {
" Unicode " , " UnicodeBig " , " UnicodeLittle " ,
" UnicodeBigUnmarked " , " UnicodeLittleUnmarked " ,
" UTF-16 " , " UTF-16BE " , " UTF-16LE "
};

for ( int i = 0 ; i < encoding.length; i ++ ) {
System.out.printf(
" %-22s %s%n " ,
encoding[i],
bytes2HexString(str.getBytes(encoding[i]))
);
}
}

public static String bytes2HexString( byte [] bys) {
char [] chs = new char [bys.length * 2 + bys.length - 1 ];
for ( int i = 0 , offset = 0 ; i < bys.length; i ++ ) {
if (i > 0 ) {
chs[offset
++ ] = ' ' ;
}
chs[offset
++ ] = HEX[bys[i] >> 4 & 0xf ];
chs[offset
++ ] = HEX[bys[i] & 0xf ];
}
return new String(chs);
}
}

输出结果:

Unicode ff fe 2d 4e fd
56
UnicodeBig fe ff 4e 2d
56 fd
UnicodeLittle ff fe 2d 4e fd
56
UnicodeBigUnmarked 4e 2d
56 fd
UnicodeLittleUnmarked 2d 4e fd
56
UTF
- 16 fe ff 4e 2d 56 fd
UTF
- 16BE 4e 2d 56 fd
UTF
- 16LE 2d 4e fd 56



总结:

1. Unicode 的字节序方式采用 sun.io.unicode.encoding 的系统属性,并且是加上 BOM 的。
    转换类为:sun.io.CharToByteUnicode

2. UnicodeBig 字节序为 BE 方式,加上 BOM
    转换类为:sun.io.CharToByteUnicode 不过在 sun.io.CharToByteUnicodeBig 中强制使用 BE 序,
    即即构造时强制设定 byteOrder 值为 1

3. UnicodeLittle 字节序为 LE 方式,加上 BOM
    转换类为:sun.io.CharToByteUnicode 不过在 sun.io.CharToByteUnicodeLittle 中强制使用 LE 序,
    即即构造时强制设定 byteOrder 值为 2

4. UnicodeBigUnmarked 字节序为 BE 方式,有 Unmarked 不加 BOM
    转换类为:sun.io.CharToByteUnicode 不过在 sun.io.CharToByteUnicodeBigUnmarked 中强制使用 BE 序和不加 BOM。
    即构造时强制设定 byteOrder 值为 1,usesMark 值为 false

5. UnicodeLittleUnmarked 字节序为 LE 方式,有 Unmarked 不加 BOM
    转换类为:sun.io.CharToByteUnicode 不过在 sun.io.CharToByteUnicodeLittleUnmarked 中强制使用 LE 序和不加 BOM。
    即构造时强制设定 byteOrder 值为 2,usesMark 值为 false

6. UTF-16 字节序为 BE 方式,加上 BOM
    转换类为:sun.io.CharToByteUnicode 不过在 sun.io.CharToByteUTF16 中强制使用 BE 序和加 BOM。
    即构造时强制设定 byteOrder 值为 1,usesMark 值为 true
    UTF-16 实际上与 UnicodeBig 是一样的。

7. UTF-16BE 没有转换类,与 UnicodeBigUnmarked 使用相同的转换器。

8. UTF-16LE 没有转换类,与 UnicodeLittleUnmarked 使用相同的转换器。


上面的那些类都是 sun.io.CharToByteUnicode 的子类,这些子类中就只有设定各种格式的构造方法。

根据 CharacterEncoding 的映射与 UnicodeBigUnmarked 兼容的编码有:unicode-1-1, iso-10646-ucs-2, utf-16be, x-utf-16be 这么几个。而且 UnicodeLittleUnmarked 兼容的有:utf-16le, x-utf-16le 这两个。



30楼
之前的话:
来迟了!但不可惜。呵呵。

输出结果:
[-2, -1, 0, 49]

问题现象:
“意外”地多了两个字节,即数组前两个元素,其值分别为-2、-1

问题原因:
楼上各位已经说得非常清楚,详见7楼与11楼

相关源码:
这是楼主最感兴趣的内容,所以说得详细一些。
String的encode()方法里边调用了StringCoding的encode()方法。
StringCoding的encode()方法有点复杂,包括缓存机制、Charset对象的创建等,但主要是调用了其嵌套类StringEncoder的encode()方法。
而StringCoding.StringEncoder类的encode()方法又用到了CharsetEncoder类的encode()方法。
CharsetEncoder的encode()又调用了它自己的encodeLoop()方法。——这就是答案所在。换句话说,输出BOM的源代码就在CharsetEncoder的encodeLoop()方法中。
encodeLoop()方法是抽象方法,不同的子类有不同的实现。
针对于“Unicode”编码,其对应的类为sun.nio.cs.UTF_16的嵌套类Encoder,以下是其源码:
Java code
   

private static class Encoder extends UnicodeEncoder
{
public Encoder(Charset charset)
{
super (charset, 0 , true );
}
}


以下是其父类UnicodeEncoder的部分源码:
Java code
   

// 构造方法
protected UnicodeEncoder(Charset charset, int i, boolean flag)
{
super (charset, 2.0F , flag ? 4F : 2.0F , i != 0 ? ( new byte [] {
- 3 , - 1
}) : (
new byte [] {
- 1 , - 3
}));
usesMark
= needsMark = flag;
byteOrder
= i;
}
// 最终完成编码任务的方法——答案所在。
protected CoderResult encodeLoop(CharBuffer charbuffer, ByteBuffer bytebuffer)
{
// 省略无关代码

if (needsMark)
{
if (bytebuffer.remaining() < 2 )
return CoderResult.OVERFLOW;
put(
' /uFEFF ' , bytebuffer);
needsMark
= false ;
}

// 省略无关代码
}


看完源码,再分析一下执行过程:
1、因为当前使用的字符编码是“Unicode”,所以对应的CharsetEncoder是sun.nio.cs.UTF_16.Encoder
2、在创建UTF_16.Encoder的对象时,其传给父类构造函数的第三个参数是true,意味着needsMark将被赋值为true
3、由于needsMark为true,在encodeLoop()执行的时候,会写入0xFE、0xFF。然后needsMark被赋值为false,意味着BOM最多只写入一次
4、0xFE、0xFF转换成byte,就分别是-2、-1

问题补充:
楼主又问到,为什么使用“UTF-8”时不会加BOM?
参见第19楼。

而从源代码的角度来说,因为“UTF-8”所对应的CharsetEncoder是sun.nio.cs.UTF_8.Encoder,
在这个类的源代码中,encodeLoop()方法及与其的encodeArrayLoop()、encodeBufferLoop()方法的确没有写入BOM的操作,呵呵。

后面的话:
1、我的结论与27楼不太一致,27楼说的是sun.io.CharToByteUnicode,但我觉得我的跟踪和分析过程是正确的,我是在JDK6下做的这个过程。呵呵。
2、强手如云啊,学习了!呵呵。


再次感谢火龙果,钦佩他的研究精神和无私奉献精神以及超强的忍耐力(我有时挺烦人的)。
感谢 lky5387 的精彩发言
感谢 accp206 在最后时刻的发言。

也感谢所有的参与者,大家都提高了经验值。

Cheat Engine 字符串修改详解:3种类型选择与10字节长度调整技巧 本文详细解析了Cheat Engine中字符串修改的3种类型选择与10字节长度调整技巧,涵盖字串、字符数组和宽字符串的应用场景及实战案例。通过Windows平台下的逆向工程实践,帮助读者掌握游戏文本修改的核心技术,提升数据挖掘效率。 阅读详情

相关推荐

11-12.Python字符串和编码

11-12.Python字符串和编码

孤寒者的博客 1万+

Java中的字符编码(Unicode、UTF-8、UTF-16)的那些事儿

首先看一下下面的程序(测试英文和中文在Unicode、UTF-8、UTF-16这三种编码下,一个字符占几个字节) System.out.println("a(Unicode) :" + "a".getBytes("Unicode").length); System.out.println("a(Unicode) :" + "aa".getBytes...

java开发指南博客 【转载】 589

大疆上云API-1.10.0版本-设备位置数据实时处理与WebSocket推送实战解析

本文深入解析了大疆上云API 1.10.0版本中设备位置数据的实时处理与推送全链路。通过剖析源码,详细阐述了从MQTT接收OSD数据、Spring Integration路由分发、业务逻辑处理到WebSocket实时推送至前端地图的核心流程,并提供了实战优化与避坑指南,帮助开发者构建高可靠的无人机实时定位系统。

weixin_29291863的博客 413

unicode详解

unicode的中文翻译为统一码,也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准。简单的来看,unicode就是一个数字,每一个数字对应一个字符的编码,这个字符囊括了整个世界使用的全部语言和符号的字符,所以,从根本上来说,unicode就是一个映射表,一个从数字到文字的映射。

b1049112625的博客 2万+

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

Keil MDK v6迁移指南:从AC5到AC6的编译器升级与工程适配

编译器是嵌入式开发的底层基石,决定了代码的执行效率与工程的可维护性。随着ARM工具链向LLVM/Clang架构演进,Arm Compiler 6(AC6)正逐步取代经典的AC5,成为Keil MDK的核心编译引擎。AC6在C11标准支持、代码优化、诊断信息及LTO链接优化上全面超越AC5,但迁移过程中往往伴随内联汇编重写、类型检查严格化、库兼容性等问题。理解编译器差异、掌握CMSIS-Toolbox的工程描述机制,能帮助嵌入式工程师在Cortex-M系列项目中平滑过渡。本文结合Cortex-M4量产工程实战

weixin_29189363的博客 241

java 16进制转unicode,java实现十六进制字符unicode与中英文转换示例

charset US-ASCII %ShistoricalName ASCII# IANA aliasesalias iso-ir-6alias ANSI_X3.4-1986alias ISO_646.irv:1991alias ASCIIalias ISO646-USalias usalias IBM367alias cp367alias csASCIIalias default# Other ...

weixin_39779975的博客 596

【软件使用】Calibre部分提参的实战技巧与常见问题解析

本文深入解析Calibre部分提参(Partial Extraction)的实战技巧与常见问题,涵盖PEX、hcell和xcell文件的高级应用。通过实际案例展示如何提升电路仿真效率,解决时钟信号失真等复杂问题,并提供版图设计中的防坑指南,助力芯片设计工程师优化工作流程。

weixin_28717431的博客 162

字符编码方案:Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上广泛使用的字符编码,旨在解决传统字符编码方案的局限,为每种语言中的每个字符设定了统一且唯一的二进制编码,以满足跨语言、跨平台进行文本转换和处理的需求。

在那一刻,我们或许会发现自己站在了时间的另一岸,以更加成熟和宽广的胸怀,去拥抱那份隔代相传的深情。 7970

Android13无重力感应系统修改触摸屏跟随屏幕显示旋转方向旋转

在实际产品中设计时会移除重力传感器。当设备缺少重力传感器时,系统无法使用该传感器提供的方向数据来确定屏幕旋转的方向。Android 系统中由于移除重力传感器导致的默认显示方向旋转引起触摸屏与屏幕显示不一致问题,主要是由于缺乏方向检测和触摸坐标的正确转换。通过使用替代传感器(如陀螺仪)、手动配置方向、调整触摸事件坐标和 UI 布局,可以解决这个问题。开发者需要确保在设备没有重力传感器的情况下,能够通过其他方法推测方向,并确保触摸事件和 UI 动作能够正确响应设备的旋转。

weixin_35723192的博客 804

复旦微实现串口在线升级BOOT.BIN

将该 demo 生成的 app(升级用)和 fsbl、最简化 bit 文件(可选)打包成 BOOT.BIN,作为 golden image 烧写在 qspi flash 偏移 0 地址开始的位置,其中最简化 bit 文件为在线升级功能提供必要的物理通道(如果不需要,可以不打包该文件),golden image 一旦发布基本不需要进行升级,由该 golden image 负责和上位机进行通信交互,完成业务 app、业务 bit 文件、uboot 以及操作系统 image 等文件在线升级,在qspi flash

wangjie36的博客 3174

Unicode详解(附UTF-8、UTF-16和UTF-32)

Unicode 在百度百科上,对Unicode的介绍是这样的: “ Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。” Unicode源于一个很简单的想法:将全世界所有的字符包含在一...

葉無聞 1万+

YOLOv8性能提升:引入华为GhostNetv1特征提取网络

本文提出一种轻量化改进方案,将GhostNetV1作为YOLOv8的主干网络,以提升移动端部署效率。通过Ghost模块的两步特征生成机制(初级卷积+廉价操作),显著降低了30%的计算量(FLOPs)和参数量,精度损失控制在1%以内。实验表明,改进后的模型在骁龙865芯片上推理速度提升25%。核心创新包括:1)用GhostBottleneck替换CSP模块;2)保留FPN+PAN结构确保多尺度检测能力;3)提供完整的PyTorch实现方案。该工作为资源受限场景的目标检测提供了实用解决方案,未来可结合注意力机制

shrgegrb的博客 1181

【转】研究字符串转Unicode额外2个字节的来源

<br />论坛的讨论地址如下:<br />http://topic.youkuaiyun.com/u/20081009/09/e899898c-591f-4985-ae88-5972475708fb.html<br /><br /><br /> 测试代码如下:   String s = "1";    byte[] arr = s.getBytes("UNICODE");    System.out.println(Arrays.toString(arr)); // 12<br />感谢runshine 的精到和

AlphaHinex的专栏 1029

Vue3 - Element Plus 表格组件 el-table “表格行数据中又嵌套了二维对象数组“,按平级循环渲染(嵌套数组视为同级行数据), 对嵌套的数组循环展示为表格,智能合并行或列详细教程

vue3,nuxt3,element-plus,table表格组件,el-table,vue3element表格组件,数据中有二维数组怎么遍历循环显示,表格数据带二级数组怎么循环渲染显示,表格数据中存在一个数组要怎么才能显示到表格,el-table表格合并详细教程示例,table表格如果对象里面还有对象数组那该怎么去渲染,平常都是数组中一个对象渲染成一行,每行中还有嵌套数组怎么办,每个行数据下还有一个数组怎么显示,怎么把表格相同的数据合并为一行,合并上下两行相同数据单元格,合并行或列如果遇到相同单元格就合

🏆 前端领域优质创作者 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python中字符串编码形式及其所占字节

1.常见字符串编码错误 在使用Python读文件时经常遇到编码问题引起的错误,比如: UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 30: illegal multibyte sequence 遇到这种异常时可以通过读文件时规定编码方式来解决,如下: with open('zhengfu.txt','...

读万卷书 行万里路 2266

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Python3_字符编码Encoding:ASCII,Unicode,UTF-8

Python 3的字符串str类型用Unicode,直接支持多语言。 当str和bytes互相转换时,需要指定编码。最常用的编码是UTF-8。Python当然也支持其他编码方式,比如把Unicode编码成GB2312: &gt;&gt;&gt; '中文'.encode('gb2312') b'\xd6\xd0\xce\xc4' 8 bite= 1 字节   因为计算机只能处理数字,如...

wsl_cnxw的博客 4万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[转载] python中字符串编码形式及其所占字节

参考链接: Python中的字节对象与字符串 1.常见字符串编码错误 在使用Python读文件时经常遇到编码问题引起的错误,比如: UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 30: illegal multibyte sequence 遇到这种异常时可以通过读文件时规定编码方式来解决,如下: with open('zhengfu.txt','r',encoding='UTF-8') as read_...

ld909的博客 910

[1][python基础]字符串和编码[2]

[1][python基础]字符串和编码[2] 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255)如果要表示更大的整...

dongfeig54321的博客 168

ANSI编码和Unicode编码的不同

利用今天一天的时间,研究了一下ANSI编码和Unicode编码的不同,下面把我的研究成果写下来,以备日后参考。ANSI编码最常见的应用就是在Windows当中的记事本程序中,当新建一个记事本,默认的保存编码格式就是ANSI,ANSI应该算是一种压缩编码了,当遇到标准的ASCII字符时,采用单字节表示,当遇到非标准的ASCII字符(如中文)时,采用双字节表示。

Slash Youth - Jack Chai 1万+

转:字符串和编码

转: https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如

PacosonSWJTU的博客 213

从svg转base64 再到字符串编码

昨天研究 btoa 时,发现调用之前都会再执行一个转码的api (注:btoa 是转 base64 时用的,还有个跟它相反的 atob) window.btoa(unescape(encodeURIComponent(svgStr))) 我测试了一个例子,发现 unescape(encodeURIComponent(svgStr)) 貌似会对字符串里面的中文进行转码 中文字符转Unicode码 function toUnicode(str){ return str.replace(/[^\u00

Slice-dd 3255

json字符串中的大括号转义传到后台_JSON 序列化中的转义和 Unicode 编码

本文比较完整地整理一下 JSON 编码中的转义,以及 JSON 对 Unicode 编码的处理。其实这是我上一篇文章的姊妹篇。在研究 Unicode 颜文字的时候,由于我们的数据传输是通过 JSON 串来完成的,在对颜文字进行转码传输的过程中,也发现了一个问题。解决问题之后,便有了本总结文。JSON 中的普通转义字符个人认为,JSON 是目前针对程序员而言可读性(readability)最佳的数据...

weixin_39616961的博客 1233

delphi 中文转 ascii编码_【Python学习笔记】08、字符串和编码

字符编码字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个...

weixin_39646831的博客 588
上一篇: Javascript 脚本的调试经验
下一篇: JVM和JRE,JDK的关系
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值