繁体   English   中英

将MySQL文本字段编码为UTF-8文本文件 - 特殊字符的问题

[英]Encoding MySQL text fields into UTF-8 text files - problems with special characters

我正在编写一个php脚本来将MySQL数据库行导出为格式化为Adobe InDesign内部标记的.txt文件。

导出工作,但当我遇到像é或Chloë Hanslip这样的特殊字符时,我会得到奇怪的符号(例如Chloë Hanslip而不是Chloë Hanslip )。 我不需要为每个可能的奇怪角色进行搜索和替换,而是需要更好的方法。

我已经检查过,当文本到达数据库时,它已正确保存 - 在数据库中我看到了特殊字符。 我的导出代码基本上运行一些正则表达式以放入InDesign代码标记,并且我留下了奇怪的符号。 如果我只是将文本输出到浏览器(而不是提示下载文本文件),它会正确显示。 当我保存文件时,我使用此代码:

header("Content-disposition: attachment; filename=test.txt");

header("Content-Type: text/plain; charset=utf-8");

我尝试过utf8_encode()iconv()各种组合无济于事。 任何人都能指出我在正确的方向吗?

InDesign将无法使用标头中指定的任何编码。 (它甚至不会看到它,因为当你在Windows中保存到光盘时它不会被保留。)相反,你必须在文件的开头明确告诉它自己的特殊标签中的编码,例如:

<ANSI-WIN>

不幸的是,它没有使用标准的编码名称,并且InDesign根本没有符合UTF-8编码的标签。 您可以使用的唯一编码标记允许您包含您喜欢的任何字符:

<UNICODE-WIN>

对应于UTF-16(具有BOM的小端),具有Windows CRLF行结尾。 (唯一的其他行结束选项是MAC,你完全不需要它,因为它的老式前OSX Macs,行结束字符是CR。)

因此,给定UTF-8字符串$ s(包括UTF-8字节序列),您已经退出数据库和普通(Unix-Linux-OSX-web-style)LF换行符,您可以这样写:

$s= "<UNICODE-WIN>\r\n".str_replace("\n", "\r\n", $s);
echo iconv('UTF-8', 'UTF-16', $s);

(确保不会在之前或之后输出任何空格,因为它会破坏UTF-16编码。

在导出之前,您可以使用SET NAMES命令更改传输的编码,例如:

SET NAMES utf8;

您可以在mysql backuper软件中进行配置。

只需在数据库连接方法mysql_set_charset('utf8');之后调用PHP mysql_set_charset('utf8');

看起来像ISO-8859-1字符串作为UTF-8发送...

确保您的 字段是UTF-8并以UTF-8连接到数据库。 如果你的表和字段是UTF-8而你没有指定MySQL字符集,那么MySQL会将飞行数据转换为ISO-8859-1(latin1) - 这就是我使用过的所有主机的默认配置。远...

这是我用来执行此操作的方式(与PHP 5.2.2及更低版本兼容):

$conn = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('dbname');
if (mysql_errno())
{
    //Handle database connection error here
}

if (function_exists('mysql_set_charset'))
    mysql_set_charset('utf8', $conn); //PHP 5.2.3+ only
else
{
    if (mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn) === false)
    {
        //Unable to set database charset! Handle error here...
    }
}

然后转换为UTF-16 - 这导致我的文本编辑器仅显示为正方形的文件,

iconv可能不会添加必须放在Unicode文件开头的BOM字节\\ xff \\ xfe。

试试这个:$ out =“\\ xff \\ xfe”。 的iconv( 'UTF-8', 'UTF-16LE',$出);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM