亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

文本文件中的工件

文本文件中的工件

PHP
收到一只叮咚 2022-07-16 11:06:18
我有一個允許上傳各種文本(子)的測試項目,然后顯示這些文本文件的內容。當使用的字符不是字母時會出現問題,即像????這樣的變音符號中的西里爾字母。文本文件中的字符可以預先上傳,但是當我在服務器上打開上傳的文件時,所有字符?????都被替換為 . 是的,你沒看錯,它是一個長方形的東西。我使用這條線路,它在 localhost 上運行良好,但在共享主機上卻很合適。$temp = iconv(mb_detect_encoding($tmp, mb_detect_order(), true), "UTF-8", utf8_encode($tmp));其中$tempvariable 是要解碼的字符串。它是托管的東西,我可以做些什么來防止它嗎?PS:如果我不使用utf8_encode變量$tmp,服務器會拋出錯誤。編輯1:第一張圖片顯示了在共享主機上打開文件時的外觀。 當我復制/粘貼那個東西時,它看起來像這樣 遺憾的是它沒有在 SO 上呈現。還是走運,看你怎么看……上面這句話是圖片,不是打出來的字符。然而,當您在 SO 上發帖時,我輸入的文本和上傳文件中的字符被復制然后粘貼。編輯2:我整理了一下,找出了問題所在。文件正確保存為 utf8,其中包含先前所說的字母。當文件上傳時,這些字母會變成矩形。因此,當我在服務器上打開文件時,而不是?????,我得到矩形。如何防止服務器更改任何內容并按原樣上傳?所以這不是格式化的東西,通過將編碼設置為 utf8 似乎有助于至少顯示它,如果我沒有將編碼設置為 utf8,它會引發錯誤。我使用 Laravel 作為后端。編輯3:如果我用這個從文件中讀取后測試特定的字符mb_convert_encoding(file($path)[8][9])//It should be **?** character它顯示它是 utf8,但如果是它將顯示。如果我嘗試這條線:mb_convert_encoding(file($path)[8][9], "UTF-8", "ISO-8859-1")然后它在服務器上的文件中顯示矩形的東西。如果我使用附加參數來檢測編碼,例如:mb_detect_encoding(file($path)[8], "UTF-8", TRUE);要確定它是否是實際的 utf8,它說它是錯誤的。如果我將矩形的東西粘貼到谷歌翻譯中,它會顯示一個“?”。這是正確的字母。如果我bin2hex()用來查看十六進制代碼,例如參數是?字母,我會得到 9a 十六進制代碼。如果有人知道如何重新創建能夠區分這些矩形并顯示正確的十六進制代碼或字符本身的函數,或者如何在不允許它更改文本文件中的字母編碼的情況下上傳到共享主機,或者如何解決整個問題,它將不勝感激。
查看完整描述

1 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

不要使用 utf8 編碼。它僅適用于從 ISO-8859-1 轉換,不適用于 Windows-1252。

https://www.php.net/manual/en/function.utf8-encode.php


第二個問題是您的代碼進行了雙重編碼。我標記了兩個將字符串轉換為 UTF-8 的函數。


$temp = iconv(mb_detect_encoding($tmp, mb_detect_order(), true), "UTF-8", utf8_encode($tmp));

/*      ^^^^^                                                             ^^^^^^^^^^^      */

如果下面的代碼不起作用,我將調試mb_detect_encoding($tmp, mb_detect_order(), true). 的默認值mb_detect_order()可能遠不適合您的情況。

https://www.php.net/manual/en/function.mb-detect-encoding.php

https://www.php.net/manual/en/function.mb-detect-order.php


$temp = iconv(mb_detect_encoding($tmp, mb_detect_order(), true), "UTF-8", $tmp);

您可以使用mb_convert_encoding(). https://www.php.net/manual/en/function.mb-convert-encoding.phpiconv


對于您的問題,我將編寫以下代碼:


/* If there are no Asian languages, the UTF-8 is the only encoding the mb_detect_encoding can recognize. */

if (mb_detect_encoding($tmp, 'UTF-8')) {

    $temp = $tmp;

} else {

    /* It is not UTF-8. Assume WINDOWS-1252. */

    $temp = mb_convert_encoding($tmp, 'UTF-8', 'WINDOWS-1252');

}

很難可靠地檢測到特定的單字節編碼。我不知道任何為此構建的 PHP 函數。


查看完整回答
反對 回復 2022-07-16
  • 1 回答
  • 0 關注
  • 136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號