2012-12-19 36 views
2

問號,我處理與西班牙文本一些文本文件在PHP與我的Mac OS X 10. Eclipse的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); 

?> 
+2

你需要顯示的代碼 – Esailija

回答

5

你不能做這樣的東西:

$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]; 

結果是� �

您必須解決所有的代碼,你正在做的琴絃[]訪問。您可以用mb_substr($string, $i, 1, "UTF-8");替換$string[$i]

另外,您是否設置了mb_internal_encoding"UTF-8"?否則,如果在沒有顯式編碼的情況下調用mb_*函數,它很可能不會默認爲UTF-8。

我還建議使用類似mb_convert_case($str, MB_CASE_LOWER, "UTF-8");在您的自定義lowercase功能。

+0

真棒,偉大工程!非常感謝你!! – Laaevin