 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
| 上一篇主題 :: 下一篇主題 |
| 發表人 |
內容 |
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. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
| 回頂端 |
|
 |
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- :
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? |
|
| 回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|