精华内容
下载资源
问答
  • 批量文件转码工具,支持GBK,UTF-8转换,window下面使用,亲测可以使用!!!!!!!!!!
  • UTF8转16进制工具 Utf8ToHex

    千次下载 热门讨论 2013-06-17 13:05:32
    UTF-8字符串转换为Latin1编码,比如中文“你好”转换为“\xE4\xBD\xA0\xE5\xA5\xBD”
  • UTF-8和不带BOM的UTF-8有什么区别?

    千次阅读 2019-12-20 09:24:02
    没有BOM的 UTF-8和UTF-8有什么区别? 哪个更好?

    没有BOM的 UTF-8和UTF-8有什么区别? 哪个更好?


    #1楼

    我从另一个角度看待这个问题。 我认为带有BOM的UTF-8更好,因为它提供了有关文件的更多信息。 仅当遇到问题时,我才使用不带BOM的UTF-8。

    我长时间在页面上使用多种语言(甚至是西里尔字母 ),并且在保存文件时不使用BOM并重新打开它们以使用编辑器进行编辑(如cherouvim所述),某些字符已损坏。

    请注意,当您尝试使用UTF-8编码保存新创建的文件时,Windows的经典记事本会自动使用BOM表保存文件。

    我个人保存带有BOM的服务器端脚本文件(.asp,.ini,.aspx) 带有BOM的 .html文件


    #2楼

    具有BOM的UTF-8可以更好地识别。 我已经很难得出这个结论。 我正在一个项目中,结果之一是一个CSV文件(包括Unicode字符)。

    如果保存的CSV文件没有BOM表,则Excel会认为它是ANSI并显示乱码。 一旦在前面添加了“ EF BB BF”(例如,通过使用带UTF-8的记事本重新保存它;或带UTF-8的BOM一起使用Notepad ++),Excel就会很好地打开它。

    RFC 3629建议将BOM表字符添加到Unicode文本文件中:“ UTF-8,ISO 10646的转换格式”,2003年11月,位于http://tools.ietf.org/html/rfc3629 (此最新信息位于: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html


    #3楼

    当您要显示以UTF-8编码的信息时,您可能不会遇到问题。 例如,将HTML文档声明为UTF-8,您将在浏览器中显示包含在文档正文中的所有内容。

    但是,当我们在Windows或Linux上拥有文本, CSV和XML文件时,情况并非如此。

    例如,Windows或Linux中的文本文件是可以想到的最简单的东西之一,它不是(通常)UTF-8。

    将其另存为XML并声明为UTF-8:

    <?xml version="1.0" encoding="UTF-8"?>
    

    即使已声明为UTF-8,它也不会正确显示(不会被读取)。

    我有一串包含法语字母的数据,需要将其另存为XML以供联合使用。 无需从一开始就创建UTF-8文件(更改IDE中的选项和“创建新文件”)或在文件的开头添加BOM表

    $file="\xEF\xBB\xBF".$string;
    

    我无法将法语字母保存在XML文件中。


    #4楼

    将BOM放入UTF-8编码的文件中至少存在三个问题。

    1. 不包含任何文本的文件不再为空,因为它们始终包含BOM。
    2. 包含UTF-8 ASCII子集内的文本的文件本身不再是ASCII,因为BOM不是ASCII,这会使某些现有工具失效,并且用户无法替换这些旧版工具。
    3. 无法将多个文件连接在一起,因为现在每个文件的开头都有一个BOM。

    而且,正如其他人提到的那样,拥有BOM表来检测某物是否为UTF-8既不充分,也没有必要:

    • 这是不够的,因为任意字节序列可能会以构成BOM的确切序列开头。
    • 这是没有必要的,因为您可以像读取字节一样将它们当作UTF-8读取。 如果成功,按照定义,它是有效的UTF-8。

    #5楼

    如果您在HTML文件中使用UTF-8,在同一页面中使用塞尔维亚西里尔字母,塞尔维亚拉丁语,德语,匈牙利语或其他外来语言,则带有BOM的UTF更好。 我的观点是(计算机和IT行业已有30年的历史)。


    #6楼

    如上所述,带有BOM的UTF-8可能会导致非BOM感知(或兼容)软件出现问题。 我曾经使用基于Mozilla的KompoZer编辑了编码为UTF-8 + BOM的HTML文件,因为客户端要求使用所见即所得程序。

    保存时,布局总是会被破坏。 我花了一些时间来解决这个问题。 这些文件在Firefox中运行良好,但是在Internet Explorer中显示CSS异常,再次破坏了布局。 摆弄了几个小时的CSS链接无济于事之后,我发现Internet Explorer不喜欢BOMfed HTML文件。 再也不。

    另外,我刚刚在Wikipedia中找到了这个:

    shebang字符由扩展ASCII编码中的相同两个字节表示,包括UTF-8,UTF-8通常用于当前类Unix系统上的脚本和其他文本文件。 但是,UTF-8文件可以以可选的字节顺序标记(BOM)开头; 如果“ exec”功能专门检测到字节0x23 0x21,则在shebang之前存在BOM(0xEF 0xBB 0xBF)将阻止脚本解释器被执行。 为此,一些权威人士建议不要在POSIX(类似Unix的)脚本中使用字节顺序标记,[15]并出于更广泛的互操作性和哲学考虑


    #7楼

    一个实际的区别是,如果您为Mac OS X编写了一个shell脚本并将其另存为普通UTF-8,则将得到响应:

    #!/bin/bash: No such file or directory
    

    响应shebang行,指定您要使用的外壳:

    #!/bin/bash
    

    如果另存为UTF-8,则没有BOM(例如BBEdit )都可以。


    #8楼

    没有BOM的UTF-8没有BOM,这不会比带有BOM的UTF-8更好,除非文件的使用者需要知道(或会从中获知)文件是否为UTF-8编码或不。

    BOM通常可用于确定编码的字节序,这在大多数情况下不是必需的。

    此外,对于那些不了解或不关心BOM的用户而言,BOM可能是不必要的噪音/痛苦,并可能导致用户困惑。


    #9楼

    http://en.wikipedia.org/wiki/Byte-order_mark

    字节顺序标记(BOM)是Unicode字符,用于表示文本文件或流的字节序(字节顺序)。 它的代码点是U + FEFF。 BOM的使用是可选的,并且如果使用的话,应出现在文本流的开始。 除了将其特定用作字节顺序指示符之外,BOM字符还可以指示文本在几种Unicode表示形式中的哪一种编码。

    始终在文件中使用BOM将确保始终在支持UTF-8和BOM的编辑器中正确打开它。

    我缺少BOM的真正问题如下。 假设我们有一个包含以下内容的文件:

    abc
    

    如果没有BOM,则在大多数编辑器中都将以ANSI的形式打开。 因此,此文件的另一个用户将其打开并附加一些本机字符,例如:

    abg-αβγ
    

    糟糕...现在该文件仍在ANSI中,请猜测“αβγ”不占用6个字节,而是3个。这不是UTF-8,这会在以后的开发链中引起其他问题。


    #10楼

    UTF-8 BOM是文本流(EF BB BF)开头的字节序列,它使读者可以更可靠地猜测文件是否已以UTF-8编码。

    通常,BOM用来表示编码的字节序,但是由于字节序与UTF-8不相关,因此不需要BOM。

    根据Unicode标准不建议使用UTF-8文件BOM

    2.6编码方案

    ...对于UTF-8既不需要也不建议使用BOM,但是在从使用BOM的其他编码形式转换UTF-8数据或BOM用作UTF-8签名的情况下可能会遇到BOM。 。 有关更多信息请参见第16.8节特价 ”中的“字节顺序标记”小节。


    #11楼

    在BOM表的Wikipedia页面的底部引用: http : //en.wikipedia.org/wiki/Byte-order_mark#cite_note-2

    “对于UTF-8,既不需要也不建议使用BOM,但是在从使用BOM的其他编码形式转换UTF-8数据或BOM用作UTF-8签名的情况下,可能会遇到BOM的情况。”


    #12楼

    其他出色的答案已经回答:

    • UTF-8和使用BOM的UTF-8之间没有官方区别
    • BOM格式的UTF-8字符串将从以下三个字节开始。 EF BB BF
    • 从文件/流中提取字符串时,必须忽略这些字节(如果存在)。

    但是,作为对此的附加信息,如果字符串以UTF-8编码,则UTF-8的BOM可能是“嗅觉”的好方法...或者它可以是任何其他编码形式的合法字符串...

    例如,数据[EF BB BF 41 42 43]可以是:

    • 合法的ISO-8859-1字符串“ABC”
    • 合法的UTF-8字符串“ ABC”

    因此,虽然通过查看第一个字节来识别文件内容的编码可能很酷,但您不应依赖它,如上面的示例所示

    编码应该是已知的,而不是不可分割的。


    #13楼

    仅当文件实际包含某些非ASCII字符时,带BOM的UTF-8才有用。 如果包含该文件,则不包含任何文件,那么它可能会破坏以前将文件解释为纯ASCII的旧应用程序。 这些应用程序遇到非ASCII字符时肯定会失败,因此我认为BOM仅应在文件可以且不应再解释为纯ASCII的情况下添加。

    编辑:仅想说明一下,我完全不希望使用BOM,如果一些旧的垃圾无法使用,则将其添加进去,并且替换该旧应用程序是不可行的。

    不要期望UTF8有BOM。


    #14楼

    问题:没有BOM的UTF-8和UTF-8有什么区别? 哪个更好?

    这是Wikipedia文章中有关字节顺序标记(BOM)的一些摘录,我相信这些摘录可为该问题提供可靠的答案。

    关于BOM和UTF-8的含义:

    Unicode标准允许使用UTF-8中BOM ,但不要求也不建议使用它。 字节顺序在UTF-8中没有任何意义,因此它在UTF-8中的唯一用途是一开始就表示文本流已以UTF-8编码。

    使用BOM的 参数

    不使用BOM的主要动机是与不支持Unicode的软件向后兼容。另一个不使用BOM的动机是鼓励将UTF-8用作“默认”编码。

    论据 使用BOM:

    使用BOM的理由是,如果没有BOM,则需要进行启发式分析以确定文件正在使用的字符编码。 从历史上看,这种区分各种8位编码的分析很复杂,容易出错,有时速度很慢。 有许多库可简化任务,例如Mozilla通用字符集检测器和Unicode国际组件。

    程序员错误地认为检测UTF-8同样困难(这不是因为绝大多数字节序列都是无效的UTF-8,而这些库试图区分的编码允许所有可能的字节序列)。 因此,并非所有支持Unicode的程序都执行这种分析,而是依赖BOM。

    特别是, Microsoft编译器和解释器以及Microsoft Windows上的许多软件(例如记事本)将无法正确读取UTF-8文本,除非它只有ASCII字符或以BOM表开头,并且在保存时将BOM表添加到开头文字为UTF-8。 将Microsoft Word文档下载为纯文本文件时,Google文档将添加BOM。

    使用 BOM表 使用BOM表 ,哪个更好

    IETF建议,如果协议(a)始终使用UTF-8,或者(b)使用某种其他方式指示所使用的编码,则该协议“应禁止使用U + FEFF作为签名”。

    我的结论:

    当与软件应用程序的兼容性是绝对必要的时才使用BOM。

    还要注意,虽然参考的Wikipedia文章指出许多Microsoft应用程序都依赖BOM来正确检测UTF-8,但并非所有 Microsoft应用程序都如此。 例如,如@barlop所指出的那样 ,当将Windows命令提示符与UTF-8 †一起使用时 ,此类和more type命令不会期望BOM表存在。 如果BOM 存在时,它可以是有问题的,因为它是用于其他应用。


    chcp命令通过代码页65001提供对UTF-8( BOM)的支持。


    #15楼

    请注意,对于某些文件,即使在Windows上也必须没有 BOM。 示例是SQL*plusVBScript文件。 如果此类文件包含BOM表,则在尝试执行它们时会出错。


    #16楼

    没有BOM的UTF-8和UTF-8有什么区别?

    简短的答案:在UTF-8中,BOM编码为文件开头的字节EF BB BF

    长答案:

    最初,预期Unicode将以UTF-16 / UCS-2编码。 BOM是为此编码形式设计的。 当您有2个字节的代码单元时,有必要指出这两个字节的顺序,并且通常的惯例是在数据的开头包含字符U + FEFF作为“字节顺序标记”。 字符U + FFFE是永久未分配的,因此它的存在可用于检测错误的字节顺序。

    无论平台的字节顺序如何,UTF-8的字节顺序都相同,因此不需要字节顺序标记。 但是,它可能会发生(作为字节序列EF BB FF )从UTF-16转换为UTF-8的数据中,或者作为“签名”表示该数据是UTF-8。

    哪个更好?

    没有。 正如Martin Cote回答的那样,Unicode标准不建议这样做。 它会导致非BOM感知软件出现问题。

    检测文件是否为UTF-8的更好方法是执行有效性检查。 UTF-8对有效的字节序列有严格的规定,因此误报的可能性可以忽略不计。 如果字节序列看起来像UTF-8,则可能是这样。


    #17楼

    这个问题已经有一百万个答案了,其中许多都很好,但是我想尝试弄清楚何时应该使用或不应该使用BOM。

    如上所述,在确定字符串是否为UTF-8时对UTF BOM(字节顺序标记)的任何使用都是有根据的猜测。 如果有适当的元数据(例如charset="utf-8" ),那么您已经知道应该使用什么,否则,您需要测试并做一些假设。 这涉及检查字符串来自的文件是否以十六进制字节码EF BB BF开头。

    如果找到了对应于UTF-8 BOM的字节码,则概率很高,可以假定它是UTF-8,您可以从那里开始。 但是,如果被迫做出这种猜测,那么在读取时进行额外的错误检查仍然是一个好主意,以防万一出现乱码。 如果输入绝对不是基于源的UTF-8,则应该仅假设BOM不是UTF-8(即latin-1或ANSI)。 但是,如果没有BOM,则可以通过对编码进行验证来简单地确定它是否应为UTF-8。

    为什么不建议使用BOM?

    1. 不支持Unicode或不兼容的软件可能会认为它是latin-1或ANSI,并且不会从字符串中删除BOM,这显然会引起问题。
    2. 并不是真正需要的(只需检查内容是否符合要求,当找不到符合要求的编码时,始终使用UTF-8作为后备)

    什么时候应该使用BOM编码?

    如果您无法以其他任何方式(通过字符集标记或文件系统元数据)记录元数据,并且无法像BOM一样使用程序,则应使用BOM进行编码。 在Windows上尤其如此,在Windows上,通常假定没有BOM的任何东西都在使用旧版代码页。 BOM告诉Office之类的程序,是的,该文件中的文本为Unicode。 这是使用的编码。

    说到它,我真正真正遇到过的唯一文件是CSV。 根据程序,它要么必须具有BOM,要么必须没有BOM。 例如,如果您在Windows上使用Excel 2007+,则要平滑打开它而不必求助于导入数据,则必须使用BOM对其进行编码。


    #18楼

    这是一个古老的问题,有很多好的答案,但应该增加一件事。

    所有答案都很笼统。 我要添加的是实际上会导致实际问题的BOM用法示例,但是很多人对此并不了解。

    BOM中断脚本

    Shell脚本,Perl脚本,Python脚本,Ruby脚本,Node.js脚本或需要由解释程序运行的任何其他可执行文件-所有这些都以shebang行开头,该看起来像其中之一:

    #!/bin/sh
    #!/usr/bin/python
    #!/usr/local/bin/perl
    #!/usr/bin/env node
    

    它告诉系统调用此类脚本时需要运行哪个解释器。 如果脚本以UTF-8编码,则可能会想在开始时包含BOM。 但是实际上是“#!” 字符不仅仅是字符。 实际上,它们是一个魔术数字 ,恰好由两个ASCII字符组成。 如果在这些字符之前放置一些东西(例如BOM),则文件看起来像是具有不同的幻数,这可能会导致问题。

    参见维基百科, 文章:Shebang,章节:幻数

    shebang字符由扩展ASCII编码中的相同两个字节表示,包括UTF-8,UTF-8通常用于当前类Unix系统上的脚本和其他文本文件。 但是,UTF-8文件可以以可选的字节顺序标记(BOM)开头; 如果“ exec”功能专门检测到字节0x23和0x21,则在shebang之前存在BOM(0xEF 0xBB 0xBF)将阻止脚本解释器被执行。 为此,一些权威人士建议不要在POSIX(类Unix)脚本中使用字节顺序标记,[14]并出于更广泛的互操作性和哲学考虑。 另外,在UTF-8中不需要字节顺序标记,因为该编码不存在字节顺序问题。 它仅用于将编码标识为UTF-8。 [加重]

    BOM在JSON中是非法的

    参见RFC 7159第8.1节

    实现不得在JSON文本的开头添加字节顺序标记。

    BOM在JSON中是多余的

    不仅在JSON中是非法的,而且也不需要确定字符编码,因为存在更可靠的方法来明确确定任何JSON流中使用的字符编码和字节序(有关详细信息,请参见此答案 )。

    BOM破坏了JSON解析器

    它不仅在JSON中是非法的并且不需要 ,而且实际上破坏了使用RFC 4627中介绍的方法确定编码的所有软件

    确定JSON的编码和字节序,检查NUL字节的前4个字节:

    00 00 00 xx - UTF-32BE
    00 xx 00 xx - UTF-16BE
    xx 00 00 00 - UTF-32LE
    xx 00 xx 00 - UTF-16LE
    xx xx xx xx - UTF-8
    

    现在,如果文件以BOM表开头,它将如下所示:

    00 00 FE FF - UTF-32BE
    FE FF 00 xx - UTF-16BE
    FF FE 00 00 - UTF-32LE
    FF FE xx 00 - UTF-16LE
    EF BB BF xx - UTF-8
    

    注意:

    1. UTF-32BE不是以三个NUL开头,因此不会被识别
    2. UTF-32LE第一个字节后没有3个NUL,因此不会被识别
    3. UTF-16BE的前4个字节只有1个NUL,因此不会被识别
    4. UTF-16LE的前4个字节只有1个NUL,因此不会被识别

    根据实现的不同,所有这些都可能被错误地解释为UTF-8,然后被错误地解释或拒绝为无效的UTF-8,或者根本无法被识别。

    此外,如果实现按照我建议的那样测试有效的JSON,则即使该输入确实被编码为UTF-8,也将拒绝该输入,因为它不以RFC规定的ASCII字符<128开头。

    其他数据格式

    不需要JSON中的BOM,这是非法的,并且会破坏根据RFC正常运行的软件。 那时不使用它应该是一个明智的选择,但是总有些人坚持通过使用BOM,注释,不同的引用规则或不同的数据类型来破坏JSON。 当然,任何人都可以自由使用BOM或其他任何需要的东西-那就不要将其称为JSON。

    对于除JSON之外的其他数据格式,请看一下它的实际外观。 如果唯一的编码是UTF- *,并且第一个字符必须是小于128的ASCII字符,那么您已经拥有确定数据的编码和字节序所需的所有信息。 即使将BOM表作为可选功能添加,也只会使其更加复杂且容易出错。

    BOM的其他用途

    至于JSON或脚本之外的用途,我认为这里已经有了很好的答案。 我想添加更多有关脚本和序列化的详细信息,因为这是导致实际问题的BOM字符的示例。


    #19楼

    Unicode 字节顺序标记(BOM)常见问题解答提供了一个简洁的答案:

    问:我应该如何处理BOM?

    答:以下是一些指导原则:

    1. 特定协议(例如,Microsoft .txt文件约定)可能要求在某些Unicode数据流(例如文件)上使用BOM。 当您需要遵循此类协议时,请使用BOM。

    2. 对于未加标签的文本,某些协议允许使用可选的BOM。 在那种情况下

      • 如果已知文本数据流是纯文本,但编码方式未知,则BOM可用作签名。 如果没有BOM,则编码可以是任何形式。

      • 如果已知文本数据流是纯Unicode文本(而不是哪个字节序),则BOM可用作签名。 如果没有BOM,则文本应解释为big-endian。

    3. 某些面向字节的协议期望在文件开头使用ASCII字符。 如果这些协议使用UTF-8,则应避免使用BOM作为编码形式签名。

    4. 在已知数据流的确切类型的地方(例如Unicode大端或Unicode小端),不应使用BOM。 特别是,每当数据流声明为UTF-16BE,UTF-16LE,UTF-32BE或UTF-32LE时,都不得使用BOM。


    #20楼

    这是我对Visual Studio,SourceTree和Bitbucket拉取请求的经验,这给了我一些问题:

    因此,在审查请求请求时,带有签名的BOM会在每个文件上包含一个红点字符(可能会很烦人)。

    在此处输入图片说明

    如果将鼠标悬停在它上面,它将显示一个类似于“ ufeff”的字符,但结果表明sourcetree没有显示这些类型的字节标记,因此它很可能最终出现在您的请求中,这应该没问题,因为VS 2017就是这样编码的现在是新文件,所以也许bitbucket应该忽略此文件或以其他方式显示它,更多信息请参见:

    红点标记BitBucket差异视图


    #21楼

    BOM倾向于在某个地方某个地方繁荣(没有双关语意)。 而且当它蓬勃发展时(例如,未被浏览器,编辑器等识别),它显示为文档开头的奇怪字符 (例如HTML文件, JSON响应, RSS ,等),并导致这种尴尬,例如奥巴马在Twitter上的谈话中遇到最近编码问题

    当它出现在难以调试的地方或忽略测试时,这很烦人。 因此,除非您必须使用它,否则最好避免它。

    展开全文
  • PB9转换utf-8例子

    热门讨论 2014-12-26 16:34:58
    PB9及以下版本没有直接转换字符编码的函数或方法,本例子使用ADODB.Stream进行转换。
  • Delphi中UTF-8,Unicode格式转换

    热门讨论 2014-08-06 10:23:45
    delphi7调用delphi2009生成的dll文件会出现乱码问题。是unicode的原因 终于找到了UTF-8、Unicode格式转换函数
  • 批量转换文件编码格式为UTF-8工具

    千次下载 热门讨论 2012-08-02 16:44:56
    批量转换文件编码格式为UTF-8工具.zip 支持多层文件夹替换! 使用说明: 1.文件根目录:即您要转码的文件所在根目录 2.转码文件目录:即您转码后的文件所在目录 3.转码文件后缀:指[文件根目录]下,需要转码的文件后缀,...
  • MySQL中的 utf8 并不是真正的UTF-8编码 ! !

    千次阅读 多人点赞 2020-06-24 16:11:52
    你知道么?MySQL中的utf8编码并不是真正的UTF-8,我们都被MySQL骗了!

    记得去年我在往MySQL存入emoji表情😲😳时,一直出错,无法导入。后来找到办法 -- 通过把utf8改成utf8mb4就可以了,并没有深究。

    一年后,我看到一篇文章讲到emoji文字占4个字节,通常要用utf-8去接收才行,其他编码可能会出错。我突然想到去年操作MySQL把utf8改成utf8mb4的事儿。

    嗯?他本身不就是utf8编码么!那我当时还改个锤子?

    难道,MySQL的utf8不是真正的UTF-8编码吗??! 卧槽这。。MySQL有bug!

    带着疑问查询了很多相关材料,才发现这竟然是MySQL的一个历史遗留问题~~ 我笑了,没想到这么牛B的MySQL也会有这段往事。

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

    目录

    一、报错回顾

    二、MySQL中utf8的趣事

    1. utf8mb4 才是真正的UTF-8

    2. utf8 的简史

    三、总结

    一张照片背后的故事


    一、报错回顾

    将emoji文字直接写入SQL中,执行insert语句报错;

    INSERT INTO `csjdemo`.`student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) 
       VALUES ('20', '陈哈哈😓', '男', '20', '181班', '9年级', '看片儿');

    [Err] 1366 - Incorrect string value: '\xF0\x9F\x98\x93' for column 'NAME' at row 1

     

    改了数据库编码、系统编码以及表字段的编码格式 → utf8mb4 之后,就可以了:
     

    INSERT INTO `student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) 
       VALUES (null, '陈哈哈😓😓', '男', '20', '181班', '9年级', '看片儿');

    二、MySQL中utf8的趣事

    MySQL 的“utf8”实际上不是真正的 UTF-8。

    在MySQL中,“utf8”编码只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。

    在utf8编码中,中文是占3个字节,其他数字、英文、符号占一个字节。

    但emoji符号占4个字节,一些较复杂的文字、繁体字也是4个字节。所以导致写入失败,应该改成utf8mb4。

    如上图中所示,这是编码改成utf8mb4后入库的数据,大家可以清晰的对比一下所占的字符数、字节数。正因如此,4字节的内容往utf8编码中插入,肯定是不行的,插不进去啊,是吧(大潘摊手)。

    MySQL 一直没有修复这个 bug,他们在 2010 年发布了一个叫作“utf8mb4”的字符集,巧妙的绕过了这个问题。

    当然,他们并没有对新的字符集广而告之(可能是因为这个 bug 让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用“utf8”,但这些建议都是错误的。


    1. utf8mb4 才是真正的UTF-8

    是的,MySQL 的“utf8mb4”才是真正的“UTF-8”。

    MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。

    在这里Mark一下:所有在使用“utf8”的 MySQL 和 MariaDB 用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。

     

     

    那么什么是编码?什么是 UTF-8?

    我们都知道,计算机使用 0 和 1 来存储文本。比如字符“C”被存成“01000011”,那么计算机在显示这个字符时需要经过两个步骤:

    1. 计算机读取“01000011”,得到数字 67,因为 67 被编码成“01000011”。
    2. 计算机在 Unicode 字符集中查找 67,找到了“C”。

    同样的:

    1. 我的电脑将“C”映射成 Unicode 字符集中的 67。
    2. 我的电脑将 67 编码成“01000011”,并发送给 Web 服务器。

    几乎所有的网络应用都使用了 Unicode 字符集,因为没有理由使用其他字符集。

    Unicode 字符集包含了上百万个字符。最简单的编码是 UTF-32,每个字符使用 32 位。这样做最简单,因为一直以来,计算机将 32 位视为数字,而计算机最在行的就是处理数字。但问题是,这样太浪费空间了。

    UTF-8 可以节省空间,在 UTF-8 中,字符“C”只需要 8 位,一些不常用的字符,比如“😓”需要 32 位。其他的字符可能使用 16 位或 24 位。一篇类似本文这样的文章,如果使用 UTF-8 编码,占用的空间只有 UTF-32 的四分之一左右。

    2. utf8 的简史

    为什么 MySQL 开发者会让“utf8”失效?我们或许可以从MySQL版本提交日志中寻找答案。

    MySQL 从 4.1 版本开始支持 UTF-8,也就是 2003 年,而今天使用的 UTF-8 标准(RFC 3629)是随后才出现的。

    旧版的 UTF-8 标准(RFC 2279)最多支持每个字符 6 个字节。2002 年 3 月 28 日,MySQL 开发者在第一个 MySQL 4.1 预览版中使用了 RFC 2279。

    同年 9 月,他们对 MySQL 源代码进行了一次调整:“UTF8 现在最多只支持 3 个字节的序列”。

    是谁提交了这些代码?他为什么要这样做?这个问题不得而知。在迁移到 Git 后(MySQL 最开始使用的是 BitKeeper),MySQL 代码库中的很多提交者的名字都丢失了。2003 年 9 月的邮件列表中也找不到可以解释这一变更的线索。

    不过我们可以试着猜测一下:

    2002年,MySQL做出了一个决定:如果用户可以保证数据表的每一行都使用相同的字节数,那么 MySQL 就可以在性能方面来一个大提升。为此,用户需要将文本列定义为“CHAR”,每个“CHAR”列总是拥有相同数量的字符。如果插入的字符少于定义的数量,MySQL 就会在后面填充空格,如果插入的字符超过了定义的数量,后面超出部分会被截断。

    MySQL 开发者在最开始尝试 UTF-8 时使用了每个字符6个字节,CHAR(1) 使用6个字节,CHAR(2)使用12个字节,并以此类推。

    应该说,他们最初的行为才是正确的,可惜这一版本一直没有发布。但是文档上却这么写了,而且广为流传,所有了解 UTF-8 的人都认同文档里写的东西。

    不过很显然,MySQL 开发者或厂商担心会有用户做这两件事:

    • 使用 CHAR 定义列(在现在看来,CHAR 已经是老古董了,但在那时,在 MySQL 中使用 CHAR 会更快,不过从 2005 年以后就不是这样子了)。
    • 将 CHAR 列的编码设置为“utf8”。

    我的猜测是 MySQL 开发者本来想帮助那些希望在空间和速度上双赢的用户,但他们搞砸了“utf8”编码。

    所以结果就是没有赢家。那些希望在空间和速度上双赢的用户,当他们在使用“utf8”的 CHAR 列时,实际上使用的空间比预期的更大,速度也比预期的慢。而想要正确性的用户,当他们使用“utf8”编码时,却无法保存像“😓”这样的字符,因为“😓”是4个字节的。

    在这个不合法的字符集发布了之后,MySQL 就无法修复它,因为这样需要要求所有用户重新构建他们的数据库。最终,MySQL 在 2010 年重新发布了“utf8mb4”来支持真正的 UTF-8。

    三、总结

    主要是目前网络上几乎所有的文章都把 “utf8” 当成是真正的 UTF-8,包括之前我写的文章以及做的项目(捂脸);因此希望更多的朋友能够看到这篇文章。

    相信还有很多跟我在同一条船上的人,这是必然的。

    所以,大家以后再搭建MySQL、MariaDB数据库时,记得将数据库相应编码都改为utf8mb4。终有一天,接你班儿的程序员发或你的领导现这个问题后,一定会在心里默默感到你的技术牛B。

    一张照片背后的故事

    张良善在1986年,成为一名西藏运输兵,每条西藏公路上都有他的身影
    1992年,张良善怀孕的妻子,重病住院
    领导了解情况后批准他回家,可当时西藏的将士们缺衣少食
    如果不在恶劣天气来临前运输完物资,将士们很可能有生命危险
    他选择留下来,继续为将士们运输物资
    但当任务结束后,妻子却因难产而死
    最后他亲手雕刻了妻子的墓碑,并跪在坟前痛哭

     

    参考资料

    https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434

    https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

    展开全文
  • 本文翻译自:Saving utf-8 texts in json.dumps as UTF8, not as \u escape sequence sample code: 样例代码: >>> import json >>> json_string = json.dumps("ברי צקלה") >>> print json_string "\u05d1\u...

    本文翻译自:Saving utf-8 texts in json.dumps as UTF8, not as \u escape sequence

    sample code: 样例代码:

    >>> import json
    >>> json_string = json.dumps("ברי צקלה")
    >>> print json_string
    "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
    

    The problem: it's not human readable. 问题:这不是人类可读的。 My (smart) users want to verify or even edit text files with JSON dumps (and I'd rather not use XML). 我的(智能)用户想要使用JSON转储来验证甚至编辑文本文件(我宁愿不使用XML)。

    Is there a way to serialize objects into UTF-8 JSON strings (instead of \\uXXXX )? 有没有一种方法可以将对象序列化为UTF-8 JSON字符串(而不是\\uXXXX )?


    #1楼

    参考:https://stackoom.com/question/1EwOd/将utf-文本保存在json-dumps中为UTF-而不是-u转义序列


    #2楼

    Use the ensure_ascii=False switch to json.dumps() , then encode the value to UTF-8 manually: 使用ensure_ascii=False切换到json.dumps() ,然后将值手动编码为UTF-8:

    >>> json_string = json.dumps("ברי צקלה", ensure_ascii=False).encode('utf8')
    >>> json_string
    b'"\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94"'
    >>> print(json_string.decode())
    "ברי צקלה"
    

    If you are writing to a file, just use json.dump() and leave it to the file object to encode: 如果要写入文件,只需使用json.dump()并将其留给文件对象进行编码:

    with open('filename', 'w', encoding='utf8') as json_file:
        json.dump("ברי צקלה", json_file, ensure_ascii=False)
    

    Caveats for Python 2 Python 2警告

    For Python 2, there are some more caveats to take into account. 对于Python 2,还有更多注意事项需要考虑。 If you are writing this to a file, you can use io.open() instead of open() to produce a file object that encodes Unicode values for you as you write, then use json.dump() instead to write to that file: 如果要将其写入文件,则可以使用io.open()而不是open()来生成一个文件对象,该对象在编写时为您编码Unicode值,然后使用json.dump()代替来写入该文件:

    with io.open('filename', 'w', encoding='utf8') as json_file:
        json.dump(u"ברי צקלה", json_file, ensure_ascii=False)
    

    Do note that there is a bug in the json module where the ensure_ascii=False flag can produce a mix of unicode and str objects. 请注意, json模块中存在一个bug,其中ensure_ascii=False标志可以生成unicodestr对象的混合体。 The workaround for Python 2 then is: 那么,Python 2的解决方法是:

    with io.open('filename', 'w', encoding='utf8') as json_file:
        data = json.dumps(u"ברי צקלה", ensure_ascii=False)
        # unicode(data) auto-decodes data to unicode if str
        json_file.write(unicode(data))
    

    In Python 2, when using byte strings (type str ), encoded to UTF-8, make sure to also set the encoding keyword: 在Python 2中,当使用编码为UTF-8的字节字符串(类型str )时,请确保还设置了encoding关键字:

    >>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
    >>> d
    {1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 2: u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'}
    
    >>> s=json.dumps(d, ensure_ascii=False, encoding='utf8')
    >>> s
    u'{"1": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4", "2": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"}'
    >>> json.loads(s)['1']
    u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
    >>> json.loads(s)['2']
    u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
    >>> print json.loads(s)['1']
    ברי צקלה
    >>> print json.loads(s)['2']
    ברי צקלה
    

    #3楼

    Using ensure_ascii=False in json.dumps is the right direction to solve this problem, as pointed out by Martijn. Martijn指出,在json.dumps中使用suresure_ascii = False是解决此问题的正确方向。 However, this may raise an exception: 但是,这可能会引发异常:

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 1: ordinal not in range(128)
    

    You need extra settings in either site.py or sitecustomize.py to set your sys.getdefaultencoding() correct. 您需要在site.py或sitecustomize.py中进行其他设置,才能正确设置sys.getdefaultencoding()。 site.py is under lib/python2.7/ and sitecustomize.py is under lib/python2.7/site-packages. site.py在lib / python2.7 /下,sitecustomize.py在lib / python2.7 / site-packages下。

    If you want to use site.py, under def setencoding(): change the first if 0: to if 1: so that python will use your operation system's locale. 如果要使用site.py,请在def setencoding()下:将第一个if 0:更改为if 1 :,以便python使用操作系统的语言环境。

    If you prefer to use sitecustomize.py, which may not exist if you haven't created it. 如果您喜欢使用sitecustomize.py,那么如果尚未创建,则可能不存在。 simply put these lines: 只需将这些行:

    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    

    Then you can do some Chinese json output in utf-8 format, such as: 然后,您可以以utf-8格式进行中文json输出,例如:

    name = {"last_name": u"王"}
    json.dumps(name, ensure_ascii=False)
    

    You will get an utf-8 encoded string, rather than \\u escaped json string. 您将获得一个utf-8编码的字符串,而不是\\ u转义的json字符串。

    To verify your default encoding: 验证默认编码:

    print sys.getdefaultencoding()
    

    You should get "utf-8" or "UTF-8" to verify your site.py or sitecustomize.py settings. 您应该获得“ utf-8”或“ UTF-8”来验证site.py或sitecustomize.py设置。

    Please note that you could not do sys.setdefaultencoding("utf-8") at interactive python console. 请注意,您无法在交互式python控制台上执行sys.setdefaultencoding(“ utf-8”)。


    #4楼

    UPDATE: This is wrong answer, but it's still useful to understand why it's wrong. 更新:这是错误的答案,但是了解为什么它仍然是有用的。 See comments. 看评论。

    How about unicode-escape ? unicode-escape怎么样?

    >>> d = {1: "ברי צקלה", 2: u"ברי צקלה"}
    >>> json_str = json.dumps(d).decode('unicode-escape').encode('utf8')
    >>> print json_str
    {"1": "ברי צקלה", "2": "ברי צקלה"}
    

    #5楼

    Peters' python 2 workaround fails on an edge case: Peters的python 2解决方法在边缘情况下失败:

    d = {u'keyword': u'bad credit  \xe7redit cards'}
    with io.open('filename', 'w', encoding='utf8') as json_file:
        data = json.dumps(d, ensure_ascii=False).decode('utf8')
        try:
            json_file.write(data)
        except TypeError:
            # Decode data to Unicode first
            json_file.write(data.decode('utf8'))
    
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 25: ordinal not in range(128)
    

    It was crashing on the .decode('utf8') part of line 3. I fixed the problem by making the program much simpler by avoiding that step as well as the special casing of ascii: 它在第3行的.decode('utf8')部分崩溃。我通过避免该步骤以及ascii的特殊大小写,使程序更加简单,从而解决了该问题:

    with io.open('filename', 'w', encoding='utf8') as json_file:
      data = json.dumps(d, ensure_ascii=False, encoding='utf8')
      json_file.write(unicode(data))
    
    cat filename
    {"keyword": "bad credit  çredit cards"}
    

    #6楼

    Here's my solution using json.dump(): 这是我使用json.dump()的解决方案:

    def jsonWrite(p, pyobj, ensure_ascii=False, encoding=SYSTEM_ENCODING, **kwargs):
        with codecs.open(p, 'wb', 'utf_8') as fileobj:
            json.dump(pyobj, fileobj, ensure_ascii=ensure_ascii,encoding=encoding, **kwargs)
    

    where SYSTEM_ENCODING is set to: 其中SYSTEM_ENCODING设置为:

    locale.setlocale(locale.LC_ALL, '')
    SYSTEM_ENCODING = locale.getlocale()[1]
    
    展开全文
  • UTF-16转UTF-8的方法,防止文件有BOM头

    千次阅读 2019-01-27 10:25:07
    在读公司代码的时候,发现了一个UTF-16转UTF-8的方法,这还是博主第一次见到这种方法,不由的好奇了起来。为什么要转,应用场景是什么呢?这里大家一起来探讨下 二、贴代码 /** * @desc UTF-16转为UTF-8编码, 必须...

    一、前言

          在读公司代码的时候,发现了一个UTF-16转UTF-8的方法,这还是博主第一次见到这种方法,不由的好奇了起来。为什么要转,应用场景是什么呢?这里大家一起来探讨下

    二、贴代码

       /**
         * @desc   UTF-16转为UTF-8编码, 必须带有BOM文件头的才可以转,
         *          UTF-16LE BOM文件头: [0xFF, 0xFE],
         *          UTF-16BE BOM文件头: [0xFE, 0xFF],
         *          UTF-8 BOM文件头: [0xEF, 0xBB, 0xBF]
         * @param $str   这里的$str是用file_get_contents获取到的文件内容
         * @return string
         */
        public static function utf16_to_utf8($str)
        {
            $c0 = ord($str[0]);
            $c1 = ord($str[1]);
            $c2 = ord($str[2]);
    
            if ($c0 == 0xFE && $c1 == 0xFF) {
                // -- UTF-16BE BOM文件头: [0xFE, 0xFF],
                $be = true;
            } else if ($c0 == 0xFF && $c1 == 0xFE) {
                // -- UTF-16LE BOM文件头: [0xFF, 0xFE],
                $be = false;
            } else if ($c0 == 0xEF && $c1 == 0xBB && $c2 == 0xBF) {
                // -- UTF-8 BOM文件头: [0xEF, 0xBB, 0xBF]
                $str = substr($str, 3);
                return $str;
            } else {
                return $str;
            }
    
            $str = substr($str, 2);
            $len = strlen($str);
            $dec = '';
            for ($i = 0; $i < $len; $i += 2) {
                $c = ($be) ? ord($str[$i]) << 8 | ord($str[$i + 1]) :
                    ord($str[$i + 1]) << 8 | ord($str[$i]);
                if ($c >= 0x0001 && $c <= 0x007F) {
                    $dec .= chr($c);
                } else if ($c > 0x07FF) {
                    $dec .= chr(0xE0 | (($c >> 12) & 0x0F));
                    $dec .= chr(0x80 | (($c >> 6) & 0x3F));
                    $dec .= chr(0x80 | (($c >> 0) & 0x3F));
                } else {
                    $dec .= chr(0xC0 | (($c >> 6) & 0x1F));
                    $dec .= chr(0x80 | (($c >> 0) & 0x3F));
                }
            }
            return $dec;
        }
    

          从这部分代码可以看出,方法起到的主要作用是把带有BOM头的文件转换为正常的UTF-8文件。这里要转换的$str是php通过file_get_contents获取到的文件内容,可能会获取到BOM头。而BOM头对后续的操作是有很大影响的,所以这里一方面是编码转换,一方面也是为了去掉BOM头,算是考虑的更全面,也更安全一些。

    PHP5中file_get_contents函数获取带BOM的utf-8文件内容

    三、关于编码格式和BOM头

    1、utf-16和utf-8编码

    这部分大家参考这篇博客:
    https://blog.csdn.net/hanbo622/article/details/52882438

    2、关于BOM头

          BOM是Byte Order Mark的缩写,即字节顺序标记,它是插入到UTF-8,UTF-16或UTF-32编码的Unicode文件开头的特殊标记,用来标识Unicode文件的编码类型。

          BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。一般的编码集中并不会出现bom头,unicode编码集中会出现。但对于 PHP来说,BOM是个大麻烦。

          对于BOM,PHP并不会忽略,在读取、包含或者引用这些文件时,PHP会把BOM作为文件开头正文的一部分,根据嵌入式语言的特点,这串字符将被直接执行(显示)出来.这就导致了一些页面的头部总是有一条白条,尽管样式padding、margin等各方面都设置好也无法让整个网页紧贴浏览器顶部,这头部白条就是这3个不可见的字符
    (0xEF 0xBB 0xBF,即BOM);另外还有的问题就是,受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效.一切依赖COOKIE、SESSION实现的功能全部无效.所以,在编辑、修改任何文本文件的时候,请使用不会乱加BOM的编辑器.
    Linux下的编辑器应该都没有这个问题.WINDOWS下,请勿使用记事本等编辑器.推荐使用Editplus,Zend studio、eclipse等编辑器。

    几种编码对应的BOM:
    
    EF BB BF        UTF-8
    FE FF             UTF-16 (big-endian)
    FF FE             UTF-16 (little-endian)
    00 00 FE FF UTF-32 (big-endian)
    FF FE 00 00 UTF-32 (little-endian)
    

    3、BOM头对php的影响

    		(1)BOM头对php文件的影响:https://www.cnblogs.com/wt645631686/p/6868826.html
    		(2)php的include等,会把文件的BOM头引入进来:http://blog.sina.com.cn/s/blog_62ea758a0102vvgq.html
    		(3)php的BOM头会造成session和cookie失效的问题:https://blog.csdn.net/ohmygirl/article/details/6931716
    	另外一个常见的bom头的地方时xml文件。解析失败的话,有很大一部分原因是这个。此时只要去掉bom头就行了。
    		(4)如果项目文件中已经有文件可能含有BOM头的话,将下面文件放在网站根目录访问即可,它会遍历当前目录下所有子目录,检测文件是否含有BOM头,并删除BOM头
    		https://www.cnblogs.com/lsy-ai/p/6244888.html?utm_source=itdadao&utm_medium=referral
    		(5)曾经我遇到的BOM头的bug问题:https://blog.csdn.net/LJFPHP/article/details/79288176
    			因为BOM头的存在,所以无法正常识别JSON字符串,去掉BOM头即可
    

    这部分是BOM头对于php程序的一些影响,后面的链接都是对应的解释,可以看一看

    附:
    代码中使用到了一些php的函数,都是不怎么常见的函数,这里给出文档地址:

    	php的ord()方法:http://www.w3school.com.cn/php/func_string_ord.asp   返回字符串的首个字母的 ASCII 值。
    	php的chr()方法:http://www.w3school.com.cn/php/func_string_chr.asp     从不同的 ASCII 值返回字符。
    

    四、总结

          博主觉得这个转换方法也是编程的细节之一吧,对于初级程序员来说,可能根本就不会考虑到这种问题,只有在碰到这种bug了,才会去尝试解决一下。而对于大佬来说,这种规避文件BOM头的方法应该是一开始就考虑到的,然后在每次使用file_get_contents读取日志文件的时候,都调用该方法,可以很大限度的减少因为BOM头而出现的bug。也是一种编程思想吧,学到了。

    end

    展开全文
  • Source Insight 3.X utf8 支持插件for win7 x64

    千次下载 热门讨论 2014-08-25 13:24:44
    Source Insight 3.X utf8 支持插件for win7 x64, 解决原作者,win7 x64不能运行的问题
  • MySQL 字符集utf8、utf8mb3、utf8mb4

    千次阅读 2018-06-26 17:07:39
    | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | utf32 | UTF-32 Unicode | utf32_general...
  • Unicode 和 UTF-8、UTF-16、UTF-32之间的关系

    千次阅读 多人点赞 2019-03-15 21:41:05
    Unicode 和 UTF-8、UTF-16、UTF-32之间的关系 要厘清它们之间的关系就要先从编码开始说起: ASCII码 我们都知道,在计算机的世界里,信息的表示方式只有 0 和 1,但是我们人类信息表示的方式却与之大不相同,很多时候...
  • 字符编码的概念(UTF-8、UTF-16、UTF-32都是什么鬼)

    万次阅读 多人点赞 2017-11-30 17:11:56
    UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。 UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来...
  • lua utf8 unicode ansi 转换

    热门讨论 2012-03-06 00:40:57
    require "lc" print(lc.help());... u2w(utf8 to unicode) w2a(unicode to ansi) w2u(unicode to utf8) u2a(utf8 to ansi) a2u(ansi to utf8) bstr(bytes of str) help(show this) wunoman@qq.com 2012/03/06
  • 编码转换工具UTF8转GBK或者GBK转UTF8

    热门讨论 2011-11-15 16:16:21
    编码转换工具UTF8转GBK或者GBK转UTF8,强烈推荐。它支持各类编码互转,且支持批量文件转码。
  • c语言gbk、utf8转换编码表及函数

    热门讨论 2013-08-28 08:51:52
    c语言的gbk和unicode的编码对照表以及gbk和utf8的相互转换函数(比较全)。
  • UTF8、UTF16、UTF32区别

    千次阅读 2019-04-10 22:19:30
    UTF8、UTF16、UTF32区别
  • Unicode、UTF-8、UTF-16之间的区别

    万次阅读 多人点赞 2018-08-29 14:51:24
    其中的UCS就是前面说的ISO制定的标准,和Unicode是完全一样的,只不过名字不一样.ucs-2对应utf-16,ucs-4对应UTF-32.UTF-8是没有对应的UCS UTF-16 并不是一个完美的选择,它存在几个方面的问题: UTF-16 能表示的...
  • java中GBK与UTF-8编码的转换

    万次阅读 多人点赞 2019-06-25 15:08:59
    java中文件编码的转换,主要说明了GBK与UTF-8编码之间的转换, 还介绍了利用cpdetector开源库确定文件文件(网页)编码的方法。
  • MySQL数据库字符集utf8如何转utf8mb4

    万次阅读 2019-05-07 17:08:48
    这几天开发的项目需要把Emoji 表情保存到数据库,原来的Mysql数据库的编码是utf8的,这就导致保存的时候报如下错误: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x95\xF0\x9F...' for column...
  • Go语言---unicode/utf8 unicode/utf16包

    千次阅读 2018-05-10 11:22:10
    unicode/utf8包utf8实现了函数和常量来支持UTF-8编码的文本。它包括在runes和UTF-8字节序列之间转换的函数。utf8里面的函数就有一些字节和字符的转换。//判断是否符合UTF编码的函数 // Valid 判断 p 是否为完整有效...
  • 全面了解mysql中utf8和utf8mb4的区别

    千次阅读 2018-10-08 17:34:23
    好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。 二.内容描述  那上面说了既然utf8能够存下大部分中文汉字,那为什么还要...
  • 官方文档:MySQL 8.0 Reference Manual: 10.9.2 The utf8mb3 Character Set (3-Byte UTF-8 Unicode Encoding) 首先,上结论: 国际上的UTF-8,在MySQL中,对标的是uft8mb4。 在MySQL中,实际只有utf8mb4和utf8mb3...
  • (Unicode) UTF-8与UTF-16之间转换

    万次阅读 2016-10-21 13:33:39
    于是从1996年有了第二个版本,用四个字节表示所有字符,这样就出现了UTF-8、UTF16、UTF-32,原理和之前是完全一样的,UTF-32就是把所有的字符都用32bit也就是4个字节来表示。然后UTF-8、UTF-16就视情况而定了。UTF-8...
  • 文本文件编码转换工具 gbk utf8 gb2312

    千次下载 热门讨论 2010-01-26 18:27:23
    -----MySQL 字符集: UTF-8 Unicode (utf8) -----> 2)建表时候一切默认;至于导入*.SQL没试应该是不用动什么<!-----MySQL 字符集: UTF-8 Unicode (utf8) -----> 3)在 php 文件头部加入 ; charset=utf-8"></HEAD> ...
  • UTF-8编码规则

    万次阅读 多人点赞 2019-04-25 10:10:40
    UTF-8编码规则(转) 2018年08月08日 00:24:18 机器猫的世界 阅读数:1463 ...
  • 明确Unicode,UTF-8,string,wstring概念,以及locale name之前, 先简单了解两个概念 字符集: 为每一个字符(asic,中文,日文,俄文等)分配一个唯一的ID(又称码位)。 编码规则:将码位转换为字节序列的规则...
  • 数据库字符集utf8和utf8mb4的详细区别

    千次阅读 2019-04-17 21:01:57
    最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrectstringvalue:‘\xF0\x9F\x98\x83<…’forcolumn‘summary’at row1我用的是UTF-8...
  • oracle 字符集 AL32UTF8、UTF8

    千次阅读 2019-08-25 21:11:18
    因此,如果数据库版本都在9i及其以上,不需要考虑ORACLE8的数据库,建议使用AL32UTF8字符集,它采用的Unicode标准要比UTF8采用的Unicode标准更新,支持的字符也更多一些。如果要考虑ORACLE8数据库,建议使用UTF8字符...
  • GB2312编码和UTF-8互转(c语言实现)

    热门讨论 2013-01-01 14:55:23
    GB2312编码与utf-8编码的字符串的转换,主要使用windows api函数MultiByteToWideChar和WideCharToMultiByte,代码简洁,经测试可用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,934,564
精华内容 1,573,825
关键字:

utf