iT邦幫忙

0

全形空白的輸出

php

小弟用PHP 寫檔
遇到要寫入全形空白的狀況
率先嘗試寫& emsp; 
但是這在txt檔中貌似不會變成全形空白
會直接寫出"& emsp;"出來

改用直接打出全行空白的方式(這 樣)
但一段文字全部都變亂碼
我有查過資料
可能跟編碼有關 但我也有嘗試過把全形空白轉big5或UTF-8
但還是一堆亂碼

還有其他方法能輸出全形空白嗎?

ccutmis iT邦高手 2 級 ‧ 2019-12-26 10:47:12 檢舉
試試html實體(HTML Entities)...
例如: 測 試
網頁顯示: 測 試

參考:
https://shunnien.github.io/2017/06/03/html-nbsp-emsp-emsp-difference/
st474ddr iT邦新手 2 級 ‧ 2019-12-26 10:50:16 檢舉
大大我第一個方法打的就是
只是剛剛變成全形空白了我沒注意到= =
這個方法在txt裡面好像不會被接受
ccutmis iT邦高手 2 級 ‧ 2019-12-26 11:20:53 檢舉
哈哈 我可能是眼殘沒看到...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
ccutmis
iT邦高手 2 級 ‧ 2019-12-26 11:14:11
最佳解答

簡單試了一下,下面的demo執行後會生成一個"test.txt"

<?php
	$Handle = fopen("test.txt", 'w');
	$fullWidthSpace=' ';
	$Data ='1測試'.$fullWidthSpace.'看看喔';
	$Data.="\n換行\n";
	$Data.='2測試'.$fullWidthSpace.'看看喔';
	fwrite($Handle, $Data);
	fclose($Handle); 
?>

test.txt 內容為:

1測試 看看喔
換行
2測試 看看喔

在PHP裡面可以用單引號(')跟雙引號(")來包含字串,如果字串內容是不變的通常會建議用單引號來包含(效能較好),會用到雙引號通常是字串裡面包含一些變數或是要換行這種,例如:

$tmpVar='aloha';
$data="My nickname is $tmpVar.\nHow do you do?";
// 若印出$data為 My nickname is aloha.
// How do you do?

但如果是直接把全形空白用雙引號包含進去會出錯,例如:

$fullWidthSpace=' ';
$Data ="測試$fullWidthSpace看看喔";
//這樣會有問題

改成用單引號加上.(PHP的字串連接符)來處理就不會有問題了,例如:

$fullWidthSpace=' ';
$Data ='測試'.$fullWidthSpace.'看看喔';
//這樣不會有問題

為何會有這種bug,我猜是跟Unicode長度切割有關,相關資訊參考:
https://alrin0000.blogspot.com/2014/03/unicodeutf-8utf-16.html

看更多先前的回應...收起先前的回應...
st474ddr iT邦新手 2 級 ‧ 2019-12-26 11:28:03 檢舉

奇怪這方法我會變成亂碼
可能是編碼的問題我找找看

大大指教的是
我所有字串都用雙引號哈哈

st474ddr iT邦新手 2 級 ‧ 2019-12-26 11:37:59 檢舉

用notepad開是亂碼
https://ithelp.ithome.com.tw/upload/images/20191226/201235658Hz1ouwzKH.jpg
用notepad++開來看是正常 只是有奇怪的編碼標示
https://ithelp.ithome.com.tw/upload/images/20191226/20123565D8DHbrDWBo.jpg

ccutmis iT邦高手 2 級 ‧ 2019-12-26 11:38:11 檢舉

會變亂碼的話 可能是編輯器問題 你試試用 notepad++編輯看看?(文件編碼要設為UTF-8)

然後就是把有用到全形空白的字串全改成用單引號加.的方式連接,理論上應該就沒問題了。

還有要注意字串內容是不是Big5編碼,如果是Big5碼直接轉UTF-8某些字變???是正常的,詳情請Google "許功蓋",這個現在應該很少見了,比較常見在老舊軟體或資料庫要從Big5升UTF-8時。

st474ddr iT邦新手 2 級 ‧ 2019-12-26 11:44:49 檢舉

然後就是把有用到全形空白的字串全改成用單引號加.的方式連接,理論上應該就沒問題了。

可是大大
我需要全形空白的程式碼
都長這樣

str_pad("蘇XX",50,$fullWidthSpace)

這樣也不會有單引號和.的問題吧QQ

ccutmis iT邦高手 2 級 ‧ 2019-12-26 11:50:53 檢舉

可是大大
我需要全形空白的程式碼
都長這樣
str_pad("蘇XX",50,$fullWidthSpace)
這樣也不會有單引號和.的問題吧QQ

這個我不知道 因為我不清楚你的 str_pad 函式是怎麼寫的
你貼的這行 str_pad("蘇XX",50,$fullWidthSpace)
就是呼叫一個函式 str_pad
並傳入三個參數 "蘇XX" 50 $fullWidthSpace
你應該去看 function str_pad(...) 是怎麼處理傳入參數的,然後依照正確的方式修改字串連接的部份。

st474ddr iT邦新手 2 級 ‧ 2019-12-26 12:00:28 檢舉

謝謝大大
我處理好了 我額外寫了一個utf-8專用的str_pad
輸出就可以正常了

ccutmis iT邦高手 2 級 ‧ 2019-12-26 12:05:40 檢舉

GOOD JOB!
/images/emoticon/emoticon12.gif

淺水員 iT邦大師 6 級 ‧ 2019-12-26 12:42:52 檢舉

str_pad 是用每個 byte 去算長度的
所以如果要的話是這樣用

$ws=' '; //全形空白
$str='測試';
$padLen=strlen($ws)*2+strlen($str); //計算加2個全形空白總長
$output=str_pad($str, $padLen, $ws, STR_PAD_LEFT);
echo $output;

另外 str_repeat 也可以參考

echo str_repeat(' ', 2).'測試';
ccutmis iT邦高手 2 級 ‧ 2019-12-26 13:08:12 檢舉

原來 str_pad 是PHP內建函式喔 這東東我還真的沒用過 哈哈

st474ddr iT邦新手 2 級 ‧ 2019-12-26 13:13:48 檢舉

str_pad 是用每個 byte 去算長度的
所以如果要的話是這樣用

受教了

0
YC
iT邦研究生 3 級 ‧ 2019-12-26 11:04:53

確認以下

  1. XX.php本身是utf8
  2. httpd.conf有指定DefaultCharset
  3. 在txt檔案前放入BOM(\xEF\xBB\xBF)
st474ddr iT邦新手 2 級 ‧ 2019-12-26 11:06:58 檢舉

1.確定是
2.要去查主機端嗎?請問要怎麼查?
3.這個倒是不太懂 我先研究一下

我要發表回答

立即登入回答