2

我从来没有真正理解过的一件事是字符编码的概念。编码在内存和代码中的处理方式常常让我感到困惑,因为我只是从互联网上复制了一个示例,而没有真正理解它的作用。我觉得这是一个非常重要且被忽视的主题,更多的人应该花时间去纠正(包括我自己)。

我正在寻找一些好的资源来学习不同类型的字符编码并在它们之间进行转换(最好是在 C# 中)。欢迎书籍和在线资源。

谢谢。


编辑1:

感谢您到目前为止的回复。我特别在寻找更多涉及 .NET 如何处理编码的信息。我知道这可能看起来很模糊,但我真的不知道要问什么。我想我很好奇如何在 C# 字符串类中表示编码,以及该类本身是否可以管理不同的编码类型,或者有单独的类?

4

3 回答 3

2

维基百科对字符编码有一个很好的解释:http ://en.wikipedia.org/wiki/Character_encoding 。

如果您正在寻找 UTF-8 的详细信息,它是最流行的字符编码之一,您应该阅读UTF-8 和 Unicode 常见问题解答

而且,正如已经指出的那样,“每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有借口!)”是一个非常好的初学者教程。

于 2009-09-11T11:28:39.067 回答
2

我会从这个问题开始:什么是角色?

  • 逻辑标识:一个代码点。Unicode 为每个字符分配一个数字,该数字不一定与任何位/字节形式相关。编码(如 UTF-8)定义到字节值的映射。
  • 位和字节:编码形式。每个代码点一个或多个字节,值由使用的编码确定。
  • 你在屏幕上看到的东西:一个字形。字形由一个或多个代码点创建。这是在演示结束时的东西。

此代码in.txt从转换windows-1252UTF-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 (
于 2009-09-11T14:25:06.353 回答
1

有著名的 Joel 文章“每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有任何借口!)” http://www.joelonsoftware.com/articles/Unicode.html

编辑:虽然这更多的是关于文本格式,但在重新阅读时,我猜你对 html 编码和 url 编码之类的东西更感兴趣?用于转义在 html 或 url 中具有重要意义的特殊字符(例如 < 和 > 在 html 中,或 ? 和 = 在 url 中)

于 2009-09-11T11:14:02.737 回答