當前位置: 首頁> 最新文章列表> 如何避免fgetss 導致的多語言亂碼問題?實用解決方案

如何避免fgetss 導致的多語言亂碼問題?實用解決方案

gitbox 2025-08-27
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 這部分與文章內容無關,可以用來放置通用配置或註釋</span></span><span>
</span><span><span class="hljs-comment">// 例如:定義常量、加載配置文件等</span></span><span>
</span><span><span class="hljs-title function_ invoke__">define</span></span><span>(</span><span><span class="hljs-string">'APP_NAME'</span></span><span>, </span><span><span class="hljs-string">'多語言處理工具'</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

<h1>如何避免 fgetss 導致的多語言亂碼問題?實用解決方案</h1>

<p>在 PHP 中,<code></span><span><span class="hljs-title function_ invoke__">fgetss</span></span><span>()

2 . 在PHP 中指定正確的編碼

讀取內容後,可以利用mb_convert_encoding()將字符串轉換為目標編碼:

 &lt;?php
</span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'multilang.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span>) {
    </span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgetss</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-number">4096</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-comment">// 假設文件編碼是 GBK,轉為 UTF-8</span></span><span>
        </span><span><span class="hljs-variable">$utf8Line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'GBK'</span></span><span>);
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$utf8Line</span></span><span> . </span><span><span class="hljs-string">"&lt;br&gt;"</span></span><span>;
    }
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
}
?&gt;

這裡mb_convert_encoding的第三個參數是文件的原編碼,第一和第二參數分別是目標編碼和輸入字符串。

3 . 設置頁面編碼

確保輸出的HTML 頁面中有正確的編碼聲明,例如:

 &lt;meta charset=</span><span><span class="hljs-string">"UTF-8"</span></span><span>&gt;

這樣瀏覽器才能正確識別內容編碼,避免顯示亂碼。

4 . 使用PHP 內置函數檢測編碼

可以用mb_detect_encoding()自動檢測編碼,避免寫死編碼:

 &lt;?php
</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgetss</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-number">4096</span></span><span>);
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>, [</span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'GBK'</span></span><span>, </span><span><span class="hljs-string">'BIG5'</span></span><span>], </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$encoding</span></span><span> !== </span><span><span class="hljs-string">'UTF-8'</span></span><span>) {
    </span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$line</span></span><span>;
?&gt;

5 . 避免使用fgetss()的情況

如果純粹為過濾HTML 標籤,考慮用fgets()結合strip_tags() ,這樣編碼處理更靈活:

 &lt;?php
</span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'multilang.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span>) {
    </span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strip_tags</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>);
        </span><span><span class="hljs-comment">// 編碼轉換處理同上</span></span><span>
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$line</span></span><span>;
    }
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
}
?&gt;

三、總結

  • 文件和頁面編碼應保持一致,推薦統一使用UTF- 8
  • 讀取後用mb_convert_encoding()轉換編碼,確保字符正常顯示。
  • 避免直接依賴fgetss()的編碼假設,結合fgets()strip_tags()以提高兼容性。
  • 頁面需聲明正確的編碼,瀏覽器才能正常解析。

通過上述方法,開發者可以有效避免因fgetss()導致的多語言亂碼問題,保證程序處理多語言文本的穩定性和可讀性。