读取 ANSI 文件并转换成 UTF-8 字符串。

7

有没有用PHP实现这个的方法?

当我打印出要插入的数据时,它看起来很好。

但是当我将其插入数据库时,该字段变为空。


尝试使用mysql_real_escape_string()函数 php.net/manual/en/function.mysql-real-escape-string.php,也许要插入的字符串包含MySQL使用的字符。 - sikas
我从文本文件中读取字符串,发现其中一些返回的是ANSII编码,而另一些则为空。使用mb_detect_encoding($data)函数也无法解决问题,请问有什么解决方案吗? - user192344
并不存在 ANSII 这样的东西。 - Álvaro González
3个回答

15
$tmp = iconv('YOUR CURRENT CHARSET', 'UTF-8', $string);
或者
$tmp = utf8_encode($string);

奇怪的是你最终在数据库中得到了一个空字符串。我可以理解你会在数据库中得到一些垃圾数据,但完全没有(空字符串)是很奇怪的。

我刚刚在我的控制台中输入了这个:

iconv -l | grep -i ansi

它向我展示了:

ANSI_X3.4-1968
ANSI_X3.4-1986
ANSI_X3.4
ANSI_X3.110-1983
ANSI_X3.110
MS-ANSI

这些是您当前字符集的可能值。

正如之前指出的,当您的输入字符串包含允许在UTF中使用的字符时,您不需要进行任何转换。

当您不想省略字符,但想用类似的字符替换它们(当它们不在UTF-8集合中时)时,请将UTF-8更改为UTF-8//TRANSLIT。


1
utf8_encode 函数将 ISO 8859-1 编码转换为 UTF-8 编码。因此,只有在输入编码为 ISO 8859-1 时才能使用该函数。 - Gumbo
我尝试使用 $data = iconv('ASCII', 'UTF-8', $data); 代码,但是出现了以下错误信息:iconv() [function.iconv]: Detected an illegal character in input string。 - user192344
ASCII是UTF-8的子集。如果数据实际上是ASCII(但错误消息并非如此),则无需进行转换。 - Álvaro González
我从文本文件中读取字符串,发现其中一些返回的是ANSII编码,而另一些则为空。使用mb_detect_encoding($data)函数也无法解决问题,请问有什么解决方案吗? - user192344
当返回false时,只需打开文件并用眼睛查找垃圾。手动删除它,然后再试一次。如果这样可以的话,您可以编写一个过滤函数,在检测编码之前运行。 - Mark Bekkers

8
"ANSI"并不是一种字符集,而只是缩写,表示“由创建数据的计算机默认使用的任何字符集”。因此您需要完成两个任务:
1. 找出数据所使用的字符集。 2. 使用适当的函数将其转换为UTF-8。
对于任务 #2,通常我会使用iconv(),但如果源数据恰好使用ISO-8859-1,则utf8_encode()也可以胜任。
更新:
看起来您不知道数据使用的是哪种字符集。在某些情况下,如果您知道用户的国家和语言(例如,西班牙/西班牙语),则可以通过Microsoft Windows在该地区使用的默认编码来确定它。

5
我讨厌那些使用“ANSI”一词的编辑。这类似于错误地将“Unicode”用于UTF-16。 - Gumbo
OP 告诉了你他从 mb_detect_encoding 获取到的返回值。 - Henrik Erlandsson
mb_detect_encoding()并不能像大多数人想的那样实现功能。事实上,它几乎是无用的。最多,您可以使用它来区分UTF-8和UTF-16,但需要正确配置它。 - Álvaro González

3

请注意,使用iconv()可能会返回false,如果转换失败。

我也遇到了类似的问题,如果文件编码为UNICODE,则一些中文字母会被错误地识别为\n,但如果是UFT-8,则不会出现这种情况。

回到你的问题,确保文件的编码与数据库的编码相同。另外,对已经是utf-8文本的使用utf-8_encode()可能会产生不愉快的结果。尝试使用mb_detect_encoding()查看文件的编码,但不幸的是,这种方法并不总是有效的。从我所看到的来看,字符编码没有简单的解决办法 :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接