Encoding Windows 1252是否是UTF-8的子集?

Encoding Windows 1252是否是UTF-8的子集?,encoding,utf-8,windows-1252,Encoding,Utf 8,Windows 1252,我只是想知道windows 1252是否是UTF-8的子集?有什么区别 考虑将my DB从windows 1252迁移到UTF-8,有什么想法和意见吗?windows-1252是UTF-8的一个子集,以“哪些字符可用”,而不是按字节表示。Windows-1252包含127到255字节之间的字符,UTF-8对这些字符采用不同的编码 ASCII范围127及以下的任何可见字符都以UTF-8的1:1编码 因此,虽然您可以在两者之间进行转换,但CP-1252字符串不能保证是有效的UTF-8字符串。Ansi

我只是想知道windows 1252是否是UTF-8的子集?有什么区别


考虑将my DB从windows 1252迁移到UTF-8,有什么想法和意见吗?

windows-1252是UTF-8的一个子集,以“哪些字符可用”,而不是按字节表示。Windows-1252包含127到255字节之间的字符,UTF-8对这些字符采用不同的编码

ASCII范围127及以下的任何可见字符都以UTF-8的1:1编码


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

Ansi与emacs hexl模式下的Utf8。所以Cr是4372,但是还有一个带重音的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 

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

Unicode在设计上实现了从1993年最常用的字符编码来回的无损转换。CP-1252比Unicode旧,并且经常使用,因此Unicode被设计为包含所有CP-1252

这种设计是针对您的情况指定的:您可以一次转换一个图层,而不会丢失信息,因此不需要卖旗日。您只需转换数据库,然后将客户机[driver]设置为转换回CP-1252。通常默认情况下,客户机知道您期望的编码是什么,并且他们知道数据库将提供什么,所以它将进行转码。在第二步中,您可以更改客户端部分,稍后可能还可以更改前端

您只需要关心一些问题:Unicode有各种规范形式,同一个字符有更多可能的表示形式。从CP-1252来看,这不是一个问题,但在后面,您可能会遇到问题,具体取决于您使用的库。如果你需要转换回来,只需做一些实验

许多代码在Unicode和CP-1252中都是相同的,但编码UTF-8需要两个或更多字节来表示127左右的代码,因此这些代码不兼容字节到字节。但通常一个简单的查找表256个元素就足够了


从理论上讲,不可打印字符是相同的,但每个系统都可能更改解释,例如换行、换页[新页或现在经常是新节],或以^[.但这与您无关。

好的,因此我计划通过以下操作将我的DB从Window-1252字符集迁移到UTF-8:导出我的DB备份,截断所有表,运行alter数据库字符集,最后导入DB…但是在这种情况下,我如何检测是否有任何字符将丢失或需要调整什么是事先准备好的?@samg在不知道您使用的是什么RDBS系统的情况下很难说。这也是这个问题的主题,所以您可以打开一个新问题。@samg:您可以使用新的字符集创建新的字段列,这样您就可以比较两个字段。您可能想要创建一个假数据库,以测试行为。请记住,代码poiUnicode中U+0080..U+009F的nts未定义。Windows-1252确实有一些字符定义在Unicode中其他地方定义的十六进制80..9F范围内。因此,在编写处理程序时必须小心。Rally UTF-8不应该有BOM表,但如果您将文件从UTF-16转换并将其转换回UTF-16,则可以。Windows使用它来准备转换,但这只是一种破解。此外,有两种规范的方法可以在UTF-8中用重音编码e。从技术上讲,UTF-8只是一种unicode编码。Windows CP1252是一种编码和一组字符。请记住,unicode中的代码点U+0080..U+009F是未定义的。Windows-1252确实有一些字符在十六进制80..9F范围内定义,这些字符在Unicode的其他地方定义。因此,在为其编写处理程序时必须小心。