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

时间:2010-04-20 13:27:18

标签: php mysql text encoding utf-8

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:4)

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

<ANSI-WIN>

不幸的是,它does not use standard encoding names并且没有任何标签可供InDesign理解,完全符合UTF-8编码。您可以使用的唯一编码标记允许您包含您喜欢的任何字符:

<UNICODE-WIN>

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

所以,给定一个包含UTF-8字节序列的UTF-8字符串$ s,你已经退出了数据库和普通(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编码。

答案 1 :(得分:2)

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

SET NAMES utf8;

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

答案 2 :(得分:1)

只需在数据库连接方法mysql_set_charset('utf8');

之后调用PHP

答案 3 :(得分:1)

看起来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...
    }
}

答案 4 :(得分:1)

  

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

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

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