文本编码


Evennia是一个基于文本的游戏服务器,因此了解它如何处理文本数据是很重要的。

文本字节编码描述了文本字符串是如何实际存储在计算机上的 —— 即用特定的字节序列来表示特定字母表中的字母。常见​​的英语编码是ASCII码,它描述了英文字母( Aa -Zz)及一些特殊字符。为了描述其它字符集(如其他不使用英文字母的语言),可使用Latin-1、ISO-8859-3 及 ARMSCII-8之类的编码。世界各地使用的字节编码有数百种。

与字节编码相对应的是unicode编码。unicode是一个由国际商定的基本上可以描述所有字符的编码表,从英语到中国及其它各种文字。这就是为什么Evennia(以及Python和Django)在内部使用Unicode存储所有的内容,但在输出数据的时候转换成其它的编码交给用户。

但问题是,当从用户处接收字符串时Evennia无法猜出用户使用的是什么编码 —— 它只是一串字节!Evennia必须知道它的编码才能与正确地同Unicode编码相互转换。


如何自定义编码

只要你坚持使用标准ASCII码字符集(这基本上代表了普通英文字符),你就不必为这部分内容多操心。

但是如果你想用其它语言构建你的游戏,或者觉得你的用户想要使用不同于ASCII码的特殊字符,你就需要考虑你想支持何种编码。

如前面所述,全世界使用的字节编码有许多许多种。有一点应该明确:Evennia无法猜测,必须设定或告知它你想用什么样的编码与服务器通信。基本上,客户端使用的编码必须与服务器相同。这可以通过两种互补的方式设定。
  1. 指导用户使用默认的 @encoding 命令,这让他们能够设定自己(或他们所选客户端)所用的编码。这样,数据在Evennia内部仍使用Unicode存储,而向这个特定用户发送和接受的所有数据在传输之前都会转换为给定的格式。
  2. 作为后备的手段,如果用户设定的编码转换是错误的或者因其它原因无法使用,Evennia将转而尝试使用设置在变量ENCODINGS中编码。这是一个编码名称列表,Evennia会逐个尝试是否可用,全部失败则给出编码错误的消息。

请注意,对每一个输入/输出都尝试几种不同的编码会增加不必要的开销。试着推测玩家最常使用的编码,并确保它们最先被尝试。国际UTF-8编码是Evennia默认的设定(Python和Django通常也是这样)。请参阅维基百科这里的文章以获得更多的帮助。


(原文:https://github.com/evennia/evennia/wiki/Text Encodings    翻译:卢铱俊)