我会从这个问题开始:什么是角色?
- 逻辑标识:一个代码点。Unicode 为每个字符分配一个数字,该数字不一定与任何位/字节形式相关。编码(如 UTF-8)定义到字节值的映射。
- 位和字节:编码形式。每个代码点一个或多个字节,值由使用的编码确定。
- 你在屏幕上看到的东西:一个字形。字形由一个或多个代码点创建。这是在演示结束时的东西。
此代码in.txt
从转换windows-1252
为UTF-8
并将其保存为out.txt
.
using System;
using System.IO;
using System.Text;
public class Enc {
public static void Main(String[] args) {
Encoding win1252 = Encoding.GetEncoding(1252);
Encoding utf8 = Encoding.UTF8;
using(StreamReader reader = new StreamReader("in.txt", win1252)) {
using(StreamWriter writer = new StreamWriter("out.txt", false, utf8)) {
char[] buffer = new char[1024];
while(reader.Peek() > 0) {
int r = reader.Read(buffer, 0, buffer.Length);
writer.Write(buffer, 0, r);
}
}
}
}
}
这里发生了两个转变。windows-1252
首先,字节从to UTF-16
(我认为是小端序)解码到char
缓冲区中。然后缓冲区转换为UTF-8
.
代码点
一些示例代码点:
- U+0041 是拉丁文大写字母 A (A)
- U+00A3 是磅符号( £)
- U+042F 是西里尔大写字母YA (Я)
- U+1D50A 是MATHEMATICAL FRAKTUR 大写字母 G (