我正在编写一个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()
的各种组合无济于事。任何人都可以指出我在正确的方向吗?
答案 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');
答案 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',$出);