VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

關於XML 的 BOM(Byte Order Mark)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Alan47



註冊時間: 2004-11-09
文章: 6


第 1 樓

發表發表於: 星期二 二月 24, 2026 9:45 pm    文章主題: 關於XML 的 BOM(Byte Order Mark) 引言回覆

請問各位先進:
在VFP7中用 FPUT() 方式作成的XML格式檔案,也宣告<?xml version="1.0" encoding="Big5"?>,上傳健保局都認定是UTF-8碼,錯誤是"解析錯誤",經過搜尋
發覺是BOM(Byte Order Mark)問題,請問
1.FPUT()寫出的 TXT檔,是否有BOM,如果'有'可以去除嗎?
2.TXT格式寫出的都是UTF-8 ,用STRCONV()轉Big5可以嗎?



應該看得出我不是很專業,業餘及興趣,沉迷而已
回頂端
檢視會員個人資料 發送私人訊息
CPS0204



註冊時間: 2014-08-24
文章: 500


第 2 樓

發表發表於: 星期三 二月 25, 2026 8:01 am    文章主題: 引言回覆

1.將你的程式及問題貼到ai 上面,ai 會回答你的
2.改用vfox9
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4264
來自: Taipei,Taiwan

第 3 樓

發表發表於: 星期三 二月 25, 2026 9:31 am    文章主題: 引言回覆

1.檢查前三BYTE 是不是 [____],有就用 LEFT()RIGHT().SUBSTR()拿掉
如果要加入,就是 BOM_STR = [____] + UTF8_STR

2. 用第三方的函示庫做 DBCS字串 <=> UTF8 字串

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
CPS0204



註冊時間: 2014-08-24
文章: 500


第 4 樓

發表發表於: 星期四 二月 26, 2026 1:41 pm    文章主題: 引言回覆

以下是ai 回答:
1. FPUTS() 寫出的檔案是否有 BOM?可以去除嗎?
答案是:FPUTS() 或 FWRITE() 本身「不會」自動產生 BOM。

為什麼會被誤認?
VFP 7 是基於 ANSI (Big5) 的環境。當你用 FPUTS() 寫入文字時,它寫入的是純粹的 Big5 位元組流。
BOM (Byte Order Mark) 通常出現在 UTF-8 (EF BB BF) 或 UTF-16 檔案的開頭。如果你的 XML 宣告是 encoding="Big5",但檔案內容包含了 VFP 處理字串時產生的某些特殊字元,或是你使用的編輯器(如 Notepad++)事後存檔時自動補上了 BOM,健保局的伺服器就會混亂。

如何確保「絕對沒有」BOM?
在寫入 XML 第一行之前,確保你沒有寫入任何隱藏字元。

程式碼片段
lnHandle = FCREATE("test.xml")
* 確保第一行直接就是 <,前面沒有任何字元
FPUTS(lnHandle, '<?xml version="1.0" encoding="Big5"?>')
...
FCLOSE(lnHandle)
2. TXT 寫出的都是 UTF-8 嗎?用 STRCONV() 轉 Big5 可以嗎?
這裡有一個觀念需要釐清:VFP 7 預設寫出的其實是 Big5 (ANSI),並不是 UTF-8。

問題癥結:健保局認定為 UTF-8,通常是因為你的檔案中包含了某些特殊大五碼字元,其位元組特徵讓對方的解析器「誤判」為不完整的 UTF-8,進而引發報錯。

關於 STRCONV():
如果你想確保產出的檔案符合特定格式,STRCONV() 是對的工具:

轉成 UTF-8 (如果健保局其實想要 UTF-Cool
lcUTF8 = STRCONV(lcBig5String, 9)

轉成 Big5:VFP 變數預設就是 Big5。如果你是從資料庫讀取,通常不需要轉。

🛠️ 職人建議解法:對抗「解析錯誤」
如果健保局堅持要 Big5,請嘗試以下步驟:

強制不含 BOM 的寫法:
不要使用 FPUTS(),改用 FILETOSTR() 與 STRTOFILE()。

程式碼片段
lcXML = '<?xml version="1.0" encoding="Big5"?>' + CHR(13) + CHR(10)
lcXML = lcXML + '<root>...</root>'
* 第三個參數用 0,代表不使用任何編碼轉換,直接寫入原始位元組
STRTOFILE(lcXML, "upload.xml", 0)
檢查非法字元:
XML 裡面如果含有 &、<、> 或是 Big5 的特殊造字,必須使用 <![CDATA[ ... ]]> 包起來,或是轉成 & 等逸脫字元。

終極測試:
用二進位編輯器(或 VFP 的 HEX(FILETOSTR(...)))看檔案前 3 個位元組。如果是 EF BB BF,那就是 UTF-8 BOM,必須刪除。
回頂端
檢視會員個人資料 發送私人訊息
Alan47



註冊時間: 2004-11-09
文章: 6


第 5 樓

發表發表於: 星期六 二月 28, 2026 2:58 am    文章主題: 引言回覆

謝謝CPS0204,大概懂了,就是含有 &、<、>特殊造字,才解析錯誤.
回頂端
檢視會員個人資料 發送私人訊息
CPS0204



註冊時間: 2014-08-24
文章: 500


第 6 樓

發表發表於: 星期一 三月 02, 2026 10:29 am    文章主題: 引言回覆

請版主改良一下,test結果,再貼文與大家分享一下結果是否ok?
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作