gpt4 book ai didi

php - 菱形中的两个问号而不是倒置的感叹号

转载 作者:行者123 更新时间:2023-12-02 22:19:25 25 4
gpt4 key购买 nike

我在我的 Mac OS X 10 上使用 eclipse-php 在 php 中处理一些带有西类牙语文本的文本文件。我将编码设置为 UTF-8,除一个小问题外一切正常。在输出文本文件中,所有 ¡(倒置的感叹号)都替换为 ��(两个黑色菱形,问号之间用空格隔开)。其他字符 (¿ñáéíóúü) 都没有给我带来任何麻烦。我的 Windows Vista 机器也有类似的问题(它将所有 ¡ 替换为 é)。知道为什么这个字符在 UTF-8 中出错以及我该如何修复它吗?

这是我正在使用的代码。我最初没有包括它,因为它太长了,我不确定问题出在哪里。如您所见,我已尝试采纳 shiplu.mokadd.im 的建议,但我仍然收到 � ��

<?php

ini_set("auto_detect_line_endings", true);

$sourceH = fopen("MainInput.txt", "r") or die("Can't open MainInput.txt.");
$sourceData = array();
$tracker = 0;

while (!feof($sourceH)){
$sourceData[$tracker] = fgets($sourceH);
$sourceData[$tracker] = preg_split("/\t/", $sourceData[$tracker]);
$tracker++;
}

$i = $tracker--;

$chars_hi = 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚÜ';
$chars_lo = 'abcdefghijklmnñopqrstuvwxyzáéíóúü';
$characters = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚÜabcdefghijklmnñopqrstuvwxyzáéíóúü1234567890'-";

function lowercase($s) {
global $chars_hi, $chars_lo;
return strtr($s, $chars_hi, $chars_lo);
}

$myNewFile = "Processing/Prepared.txt";
$fhNew = fopen($myNewFile, 'w') or die("can't open Prepared\n");
$newText = "";

for ($n = 1; $n < $i; $n++) {

$myFile = $sourceData[$n][1];
$fh = fopen($myFile,'r') or die("can't open file ".$sourceData[$n][1]."\n");
fwrite($fhNew, "\n\nStartFile ".$sourceData[$n][0]."\n\n");
$position = 0;
$speaker = ">>u";

while (!feof($fh)){
$newText = fgets($fh);
$isLast = false;
$isFirst = true;
$new = "";
if (mb_strpos($newText, ">> i") !== false or mb_strpos($newText, ">>i") !== false or mb_strpos($newText, ">i") !== false or mb_strpos($newText, "> i") !== false) {
$speaker = ">>i";
}
elseif (mb_strpos($newText, ">> s") !== false or mb_strpos($newText, ">>s") !== false or mb_strpos($newText, ">s") !== false or mb_strpos($newText, "> s") !== false) {
$speaker = ">>s";
}
for ($in = 0; $in < mb_strlen($newText); $in++) {
if (mb_strpos($characters, $newText[$in]) !== false) {
if ($isFirst == true) {
$new = $new." ".$newText[$in];
$isFirst = false;
$isLast = true;
}
else {
$new = $new.$newText[$in];
}
}
elseif ($isLast == true) {
$isLast = false;
$isFirst = true;
$new = $new." ".($in + $position)." ".$speaker." ".$newText[$in];
}
else {
$new = $new.$newText[$in];
}
}
$position += mb_strlen($newText);
$newText = $new;
$newText = lowercase($newText);
fwrite($fhNew, $newText."\n");
}
fclose($fh);
}
fclose($fhNew);

?>

最佳答案

你不能做这样的事情:

$new = $new." ".$newText[$in];

具体来说,$newText[$in]。那是字节级访问,但是当使用 UTF-8 时,字符由多个字节组成。因此,当您像这样破解和削减字节时,您会将属于一起的 UTF-8 字节分开,从而产生

例如,运行此 PHP 脚本(在文本编辑器中保存为 UTF-8):

<?php
header("Content-Type: text/html; charset=UTF-8");
$text = "ä";
echo $text[0] . " " . $text[1];

结果是���

您必须修复您对字符串进行 [] 访问的所有代码。您可以将 $string[$i] 替换为 mb_substr( $string, $i, 1, "UTF-8");

此外,您是否将 mb_internal_encoding 设置为 "UTF-8"?否则,当您在没有显式编码的情况下调用 mb_* 函数时,它很可能不会默认为 UTF-8。

我还建议在自定义 lowercase 函数上使用类似 mb_convert_case($str, MB_CASE_LOWER, "UTF-8"); 的函数。

关于php - 菱形中的两个问号而不是倒置的感叹号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13960620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com