使用正确的编码读取文件

mar*_*zzz 6 php encoding

我有一个txt文件,如果我用标准文本编辑器打开记事本或scite,我可以读取这样的字符串:

Artist1 – Title 1
Artist2 – Title 2
Run Code Online (Sandbox Code Playgroud)

比我用我的PHP脚本打开它,我读了线:

$tracklistFile_name=time().rand(1, 1000).".".pathinfo($_FILES['tracklistFile']['name'], PATHINFO_EXTENSION);
if(((pathinfo($tracklistFile_name, PATHINFO_EXTENSION)=='txt')) && (move_uploaded_file($_FILES['tracklistFile']['tmp_name'], 'import/'.$tracklistFile_name))) {
    $fileArray=file('import/'.$tracklistFile_name, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $fileArray=array_values(array_filter($fileArray, "trim"));

    for($i=0; $i<sizeof($fileArray); $i++) {
        echo $fileArray[$i]."<br />";
    }
}
Run Code Online (Sandbox Code Playgroud)

和...哇...我得到这个结果:

Artist1 ? Title1 
Artist2 ? Title2 
Run Code Online (Sandbox Code Playgroud)

??? 这些符号是什么?我认为编码失败了.符号是错误的,我无法将它们插入数据库,也没有mysql_real_escape_string().事实上,当我尝试插入它时,我收到此错误:

Incorrect string value: '\x96 Titl...' for column 'atl' at row 1
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?建议?

编辑

尝试在插入/添加这些字符串之前添加utf8_encode():现在插入不会失败,但结果是:

Artist1  Title1 
Artist2  Title2
Run Code Online (Sandbox Code Playgroud)

所以我丢失了信息.为什么?

Pau*_*ald 9

你应该阅读Joel Spolsky关于UTF-8和编码的文章.

您的问题几乎肯定源于编码不匹配,您的第一个工作是弄清楚这种不匹配发生的位置,您的问题可能出现在一堆不同的地方.

1)您的PHP代码可能使用不正确的编码读取输入(如果您尝试读取iso-8859,但源文件是以其他方式编码的)

2)您的PHP代码可能使用不正确的编码写入输出

3)无论您使用什么来读取输出(您的浏览器)都可以设置为与您编写的字节不同的编码.

一旦你找出导致你的问题的3个地方中的哪一个,你可以通过了解你的源编码是什么来解决它,以及如何使用源编码而不是其他编码(你的系统有可能)来读/写设为默认值).

编辑:不太了解PHP,看起来你可以使用mb_detect_encoding,也可能使用mb-convert-encoding.