Windows 1252是UTF-8的子集吗?

7

我想知道Windows 1252是否是UTF-8的子集,它们有什么区别?

考虑从Windows 1252迁移到UTF-8,你有什么想法或意见吗?


1
从技术角度来看,UTF-8只是Unicode的一种编码方式。Windows CP1252 是一个编码和字符集的组合。 - Giacomo Catenazzi
3个回答

11

Windows-1252是UTF-8的子集,它们在“哪些字符可用”方面相同,但在“按字节表示”的方式上不同。Windows-1252包含介于127到255字节之间的字符,而UTF-8有不同的编码。

ASCII范围内的任何可见字符(127及以下)在UTF-8中都被1:1编码。

因此,虽然你可以在两者之间进行转换, 但CP-1252字符串不能保证是有效的UTF-8字符串。


好的,我计划通过以下步骤将我的数据库从Window-1252字符集迁移到UTF-8:导出我的数据库(备份),截断所有表,运行“alter database character set”,最后再次导入数据库...但在这种情况下,我如何事先检测是否会丢失任何字符或需要进行调整? - samg
1
@samg 很难说,不知道你使用的是哪种关系型数据库系统。这也与本问题无关,或许你可以开一个新的问题来询问。 - Evert
@samg:你可以创建带有新字符集的新字段(列),这样你就可以比较两个字段。你可能需要创建一个虚拟数据库来测试行为。 - Giacomo Catenazzi
1
请注意,Unicode 中的代码点 U+0080..U+009F 是未定义的。Windows-1252 确实在十六进制范围内定义了一些字符 (hex 80..9F),但这些字符在 Unicode 中是定义过的。因此,在编写处理程序时要小心。 - Gunnar Vestergaard

0

在emacs的hexl-mode中,Ansi与Utf8的区别。所以Cr是43 72,但接下来有一个带重音的e -- é。在ansi中是e9,在utf8中是c3 a9。然后a是61。utf8文件还在开头有它的BOM或编码签名,ef bb bf。

         43 72    e9 61      Cr.a

ef bb bf 43 72 c3 a9 61  ...Cr..a 

1
Rally UTF-8 永远不应该有 BOM(但如果您将文件从 UTF-16 转换并将其转换回 UTF-16,则可以接受)。Windows 使用它来准备转换,但这只是一个 hack。此外,在 UTF-8 中编码带重音符号的 e 有两种规范方式。 - Giacomo Catenazzi

0

是的,Windows 1252字符集是Unicode的子集。

Unicode的设计实现了与1993年大多数(常见)字符编码之间的无损转换。CP-1252比Unicode旧,并且经常使用,因此Unicode被设计为包括所有CP-1252。

这种设计是针对您的情况指定的:您可以一次转换一层,而不会丢失信息,因此不需要进行标志日。您只需转换数据库,但并设置客户端[驱动程序]以将其转换回CP-1252。 (通常它是默认值,客户端知道您期望的编码,他们知道数据库将提供什么,因此它将执行转码)。在第二步中,您可以更改客户端部分(也许稍后再更改前端)。

只需注意一些问题:Unicode具有各种规范形式,以及同一字符的更多可能表示。从CP-1252开始没有问题,但在返回的路上,您可能会遇到问题,这取决于您使用的库。如果您需要转换回,请进行一些实验。

许多代码在Unicode和CP-1252中相同,但UTF-8编码需要两个(或更多)字节来处理127个代码,因此它们不是逐字节兼容的。但通常一个简单的查找表(256个元素)就足够了。

非打印字符在理论上是相同的,但每个系统可能会改变解释方式(例如换行符、进纸符[新页面或现在常见的新部分]或所有转义序列[以^ [开头])。但这对你来说并不重要。


请注意,Unicode 中的代码点 U+0080..U+009F 是未定义的。Windows-1252 确实在十六进制 80..9F 范围内定义了一些字符,这些字符在 Unicode 的其他地方也有定义。因此,在编写处理程序时必须小心处理。 - Gunnar Vestergaard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接