2019年4月30日 星期二

CSV檔補上BOM (exec PHP under apache)

開發程式時遇到一個問題。
就是CSV檔如果用EXCEL開中文的部份就會變亂碼,即使我檔案裡面明明是UTF8也一樣。

查了一下,就是要在檔案加上BOM,讓EXCEL知道檔案的編碼是UTF8

網路上可以查到很方便的解法,它是在CLI下運作的:

sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' $input_ip.csv
如果前面有加了就不要再加 如果沒有加就加

sed -i '1s/^/\xef\xbb\xbf/' test.csv
不管怎麼樣都要加。

以上這兩個都是好方法,我測試時不管是丟在PHP程式裡再用exec來執行或在CLI手動執行時都正常。但放在網頁執行就有問題。大概又是那些要加反斜線 (\)之類的問題。但試了一下都沒有解決。於是我去找其它不需要加反斜線的解法,就像下面這行:

exec("printf '\xEF\xBB\xBF' | cat - tmp.csv > policies-out.csv");
在網頁環境執行PHP一樣可以跑。  

2019年4月17日 星期三

can't convert string from 'utf-8' to native encoding 的解決方式(SVN crontab not work)

跑了很久的svn,突然不能在crontab裡作業。但手動執行卻又是好的。


svn執行時又沒有log可以看。


試了半天才想到,在crontab -e可以加mailto,讓它寄mail給我看。



執行時有這個訊息:

can't convert string from 'utf-8' to native encoding


知道問題就比較好解決,在shell script裡加上這一行就好了:

export LC_CTYPE=en_US.UTF-8

Could not find/open font (PHP GD不出圖的處理方式)

有一個老程式在搬家之後突然不work了,看了一下可以出圖但不能出字。

本來以為是新的代管主機不能上網抓google cvs的關係。但看了一下並不是。

由於代管主機不能ssh查修。先把系統移回自己的主機試一下。

在查修的時候需要開log。
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
把所有log都打開。


接著執行程式就看到以下的訊息

PHP Warning:  imagettfbbox(): Could not find/open font in /home/klting/MakeGif.php on line 250
PHP Warning:  imagettftext(): Could not find/open font in /home/klting/MakeGif.php on line 165


拿這個訊息去餵狗 ,大概知道是GD對於目錄定義的問題(我猜想是為了安全性)。

只要在呼叫imagettfbbox或imagettftext之前

先做以下設定:

putenv('GDFONTPATH=' . realpath('.'));

讓GD知道要去哪邊找字型檔就好了。


但我會建議以下做法,原因很簡單,通常代管主機的路徑很複雜。所以讓GD知道實體目錄在哪比較方便。

事實上我用上面的做法是失敗的。但用我的作法就成功了。(為了驗證這個我還多花了30分鐘)

$PATH = dirname(__FILE__);

putenv('GDFONTPATH=' . realpath($PATH));