Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将MySQL文本字段编码为UTF-8文本文件-特殊字符问题_Php_Mysql_Text_Encoding_Utf 8 - Fatal编程技术网

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

Php 将MySQL文本字段编码为UTF-8文本文件-特殊字符问题,php,mysql,text,encoding,utf-8,Php,Mysql,Text,Encoding,Utf 8,我正在编写一个php脚本,将MySQL数据库行导出到一个.txt文件中,该文件的格式为Adobe InDesign的内部标记 导出是有效的,但当我遇到像é或umlauts这样的特殊字符时,我会得到奇怪的符号(例如ChloëHanslip而不是ChloëHanslip)。我需要一个更好的方法,而不是对所有可能的怪异角色进行搜索和替换 我已经检查过,当文本进入数据库时,它被正确保存了——在数据库中我看到了特殊字符。我的导出代码基本上运行一些正则表达式来放入InDesign代码标记中,剩下的是一些奇

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

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

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

标题(“内容配置:附件;文件名=test.txt”)

标题(“内容类型:text/plain;字符集=utf-8”)


我尝试了
utf8\u encode()
iconv()
的各种组合,但都没有成功。有人能给我指出正确的方向吗?

在导出之前,您可以使用
设置名称
命令更改传输的编码,例如:

SET NAMES utf8;

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

只需在数据库连接方法后调用PHP即可
mysql\u set\u charset('utf8')

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

<ANSI-WIN>
而且InDesign根本不了解与UTF-8编码相对应的标记。您可以使用的唯一编码标记是:

<UNICODE-WIN>

它对应于UTF-16(带BOM的小端点),带有Windows CRLF行端点。(唯一的另一个行尾选项是MAC,你根本不想要它,因为它是老式的OSX之前的MAC,行尾字符是CR。)

因此,给定一个UTF-8字符串$s,其中包括从数据库中提取的UTF-8字节序列和普通(Unix Linux OSX web样式)换行符,您可以这样编写:

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

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

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

确保您的表字段在UTF-8中,并连接到UTF-8中的数据库。如果您的表和字段在UTF-8中,并且您没有指定MySQL字符集,MySQL将动态地将数据转换为ISO-8859-1(拉丁文1)-这是到目前为止我使用的所有主机的默认配置

这是我使用的方法(与PHP5.2.2及以下版本兼容):

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

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

试试这个:
$out=“\xff\xfe”.iconv('UTF-8','UTF-16LE',$out)

您是否检查了Adobe InDesign是否将此数据视为utf-8?谢谢您的回答。我生成的InDesign文件都是从开始的-我不知道其他选项,谢谢。但是,我的问题发生在代码到达这一点之前-如果我在记事本中打开文本文件,它会显示奇怪的字符-理想情况下,它们应该是我尝试了
iconv()
代码,但它报告了一个无效字符错误-可能是umlaut?!你不能真正信任记事本:它也不知道编码是什么,只是猜测。如果你看到“Chloë”在记事本中,很可能你已经用UTF-8正确地输出了它,但记事本猜测它是代码页1252(西方机器上的系统默认代码页或“ANSI”)。找一个更好的测试编辑器(例如记事本++),或者如果你想绝对确定你得到了什么,在十六进制编辑器(例如XVI32)中查看它这将显示每个该死的字节。如果
iconv('UTF-8','UTF-16',$s)
表示无效字符,那么其中就有一些不是UTF-8序列的内容。但是从“Chloë”判断我确实认为,一般来说,您可能得到了UTF-8。可能您正在将数据库字符串添加到您在PHP中创建的具有非UTF-8序列的字符串中,因为例如,您在PHP源代码中编写了
“ä”
,并将其从记事本保存为ANSI而不是UTF-8-no-BOM。(再次说明:更好的文本编辑器。)如果您无法找到它,请尝试在使用之前使用有效的-UTF-8-regexp清理UTF-8字符串。或者我认为
mb\u convert\u encoding
可能会忽略错误?感觉我现在有点进展了-您是对的,我正在向其中添加其他字符串。基本上,我有一个“模板”文件,其中包含我的InDesign代码的框架,以及相关的dat我尝试先使用
mb\u convert\u编码
,然后转换为UTF-16-这导致了一个文件,我的文本编辑器只显示为正方形,但记事本++(很好的记录!)显示得很好。它还安装了umlaut,万岁!但是在InDesign识别它时遇到问题,所以现在开始播放。啊,是的,我认为InDesign默认情况下将导出为
ANSI-WIN
,因此如果您使用的是基于此的模板文件,那么您将具有非UTF-8序列。不幸的是,您无法使用PHP本身来模板aUTF-16文件,因为PHP仅与ASCII超集编码兼容。(通常,作为一种不是ASCII超集的编码,UTF-16对于文本文件来说是一个糟糕且不寻常的选择,但这似乎是InDesign一致处理非ASCII字符的唯一可能。)我尝试了这一方法,但没有成功:(我确保数据库和字段设置为
$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...
    }
}