<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>()
读取内容后,可以利用 mb_convert_encoding() 将字符串转换为目标编码:
<?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">"<br>"</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>);
}
?>
这里 mb_convert_encoding 的第三个参数是文件的原编码,第一和第二参数分别是目标编码和输入字符串。
确保输出的 HTML 页面中有正确的编码声明,例如:
<meta charset=</span><span><span class="hljs-string">"UTF-8"</span></span><span>>
这样浏览器才能正确识别内容编码,避免显示乱码。
可以用 mb_detect_encoding() 自动检测编码,避免写死编码:
<?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>;
?>
如果纯粹为过滤 HTML 标签,考虑用 fgets() 结合 strip_tags(),这样编码处理更灵活:
<?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>);
}
?>
通过上述方法,开发者可以有效避免因 fgetss() 导致的多语言乱码问题,保证程序处理多语言文本的稳定性和可读性。