2011-07-05 94 views
7

在PHP中解析包含德文變音符號(>ä,ö,Ä,Ö,Ü)的CSV字符串時,我遇到了一些小問題。PHP str_getcsv刪除變音符號

假定以下CSV輸入字符串:

w;x;y;z 
48;OSL;Oslo Stock Exchange;B 
49;OTB;Österreichische Termin- und Optionenbörse;C 
50;VIE;Wiener Börse;D 

,並用於分析字符串,並創建其含有來自CSV字符串數據的數組中相應的PHP代碼:

public static function parseCSV($csvString) { 
    $rows = str_getcsv($csvString, "\n"); 
    // Remove headers .. 
    $header = array_shift($rows); 
    $cols = str_getcsv($header, ';'); 
    if(!$cols || count($cols)!=4) { 
     return null; 
    } 
    // Parse rows .. 
    $data = array(); 
    foreach($rows as $row) { 
     $cols = str_getcsv($row, ';'); 
     $data[] = array('w'=>$cols[0], 'x'=>$cols[1], 'y'=>$cols[2], 'z'=>$cols[3]); 
    } 
    if(count($data)>0) { 
     return $data; 
    } 
    return null; 
} 

的使用給定csv-string調用上述函數的結果爲:

Array 
(
    [0] => Array 
     (
      [w] => 48 
      [x] => OSL 
      [y] => Oslo Stock Exchange 
      [z] => B 
     ) 

    [1] => Array 
     (
      [w] => 49 
      [x] => OTB 
      [y] => sterreichische Termin- und Optionenbörse 
      [z] => C 
     ) 

    [2] => Array 
     (
      [w] => 50 
      [x] => VIE 
      [y] => Wiener Börse 
      [z] => D 
     ) 
) 

請注意,第二項缺少Ö。 僅當變音符位於列分隔符後面時纔會發生。 如果不止一個變音符號按順序排列,即「ÖÖÖsterreich」 - >「sterreich」,也會發生這種情況。 csv-string使用HTML-Form發送,因此內容得到了URL編碼。 我使用Linux服務器,在解析之前使用utf-8編碼和csv-string看起來正確。

任何想法?

+1

無法重現。爲我工作。 http://codepad.viper-7.com/v6WIaT – Gordon

+0

這是一個編碼問題。我嘗試使用UTF-8編碼將字符串直接放在php文件中。然後它工作。現在我使用$ csvString = utf8_encode($ csvString);解析代碼之前,它就像一個魅力。 – Javaguru

+1

我想,我應該確保所有的表單數據都用UTF-8編碼,使用元標記和一個適當的HTTP響應頭。 – Javaguru

回答

6

假設fgetcsv(http://php.net/manual/en/function.fgetcsv.php)工作方式類似於str_getcsv()則引述手冊頁:

區域設置是由該功能考慮 。如果LANG是例如 en_US.UTF-8,單字節 編碼的文件被此 函數讀錯。

,那麼你應該嘗試設置與區域的setlocale http://php.net/manual/en/function.setlocale.php

如果這不起作用,嘗試啓用多字節超載 http://www.php.net/manual/en/mbstring.overload.php

,甚至更好,使用標準的框架庫像Zend/Symfony庫拉出數據

0

我有一個類似的問題,在一些數據來自Microsoft Excel的ï字符,保存爲一個CSV(是的,與UTF8編碼在「另存爲...」對話框的「網頁選項」部分中選擇)。而且,這看起來不像str_getcsv預期的UTF8編碼。

我現在通過iconv先運行一切正常工作 - 似乎有東西了一個CSV文件,Excel的想法:

iconv -f windows-1252 -t utf8 source.csv > output.csv