登入 ERP 報錯 !!

登入ERP 報錯,訊息如下:
login-01

遇到這種情形,只要在登入畫面中,重新 更新 就可以解決。

文字檔 *.txt 儲存成 UTF-8 格式 (3)

在前文中,有提到手動方式用 NotePad (記事本) 開啟文字檔案,再以另存檔案、改變編碼成 UTF-8 來儲存,產生 UTF-8 格式的檔案。

不過,這種方式若是遇到很多檔案要轉換時,就會勞民傷財且傷身,我想這事我絕對不做。
那怎麼辦呢?

用程式來解決吧 (以下作業,可以不用明白其原理,只要照著做就能一切順利 -- 這是主賜的平安)

  1. 開啟 記事本(NotePad) 程式
  2. 打入下列內容
    ----------copy-inside-only----------
    Const ForReading = 1, ForWriting = 2, TristateTrue = -1, TristateFalse = 0
    Dim objFSO, objFile, strg
    Dim arg1, arg2

    If WScript.Arguments.Count = 0 Then
       WScript.Echo "No argument on the command line."
       WScript.Echo "usage: Ans2UTF8.vbs SourceFile TargetFile"
       WScript.Quit
    End If

    Set args = WScript.Arguments
    arg1 = args.Item(0)
    arg2 = args.Item(1)

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(arg1, ForReading, False, TristateFalse)
    strg = objFile.ReadAll()
    objFile.Close
    Set objFile = Nothing Set objFile = objFSO.OpenTextFile(arg2, ForWriting, True, TristateTrue)
    objFile.Write(strg)
    objFile.Close
    Set objFile = Nothing
    ----------copy-inside-only----------

  3. 存檔,檔名為 Ansi2UniCode.vbs
  4. 再建立一個 Excel 檔案:簡體2UniCode.xls
  5. Excel 內容如下

    A

    B

    C

    1

    檔案目錄 位置 C:\Ch05\  

    2

    轉碼程式 Ansi2UniCode.vbs  

    3

    檔案名稱清單(代轉) 檔案名稱清單(轉換) 開啟檔案的指令

    4

    ex5-1.php ex5-1_tc.php Ansi2UniCode.vbs C:\Ch05\ex5-1.php C:\Ch05\ex5-1_tc.php

    5

    ex5-10.php ex5-10_tc.php Ansi2UniCode.vbs C:\Ch05\ex5-10.php C:\Ch05\ex5-10_tc.php

  6. 其中 B4 儲存格內容為 =LEFT(A4,LEN(A4)-4) & "_tc" & RIGHT(A4,4)
    同理 B5 儲存格內容為 =LEFT(A5,LEN(A5)-4) & "_tc" & RIGHT(A5,4)
    以下類推,Excel 公式拉一下,就完成了。
  7. 那 C4, C5 儲存格內容,就會是

    C4

    =IF(A4="","",$B$2 & " " & $B$1 & A4 & " " & $B$1 &B4)

    C5

    =IF(A5="","",$B$2 & " " & $B$1 & A5 & " " & $B$1 &B5)

  8. 依照代轉檔案的數量(填在 A4 以下的位置),調整 B4、C4 以下的公式內容。記得要存檔。
  9. 接下來,要上演重頭戲:轉碼作業
    ● 在控制台中,改變 中文(PRC)
    ● 重新開機
    ● 開啟 命令列 (cmd.exe)
    ● 變更現行目錄到 Ansi2UniCode.vbs 存檔的目錄中
    ● 再開啟 Excel 檔 簡體2UniCode.xls ,並選取 C4 以下的內容,Copy。
    ● 回到命令列視窗中,貼上剛才複製的處理指令,就可以在 檔案目錄位置(B2內容) 中的目錄,
        看到新產生的文字檔,它們的檔案格式就會是 UniCode。(注意:還不是 UTF-8
        格式:UTF-16LE

文字檔 *.txt 儲存成 UTF-8 格式 (4)

在前文中,提到手動方式用 NotePad (記事本) 並改變編碼來產生 UTF-8 格式的檔案。
但是,若是用程式來轉換,是乎只能轉成 UniCode (UTF-16) ,還不是 UTF-8 格式;那麼是不是還有其他辦法?

有的,不過不是用 Scripting.FileSystemObject,而是用 ADODB.Stream 。
以下,就實際演練一次:

用程式解決吧 (以下作業,可以不用明白其原理,只要照著做就能一切順利 -- 這是主賜的平安)

  1. 開啟 記事本(NotePad) 程式
  2. 打入下列內容
    ----------copy-inside-only----------
    Option Explicit

    Const ForReading = 1, ForWriting = 2, TristateTrue = -1, TristateFalse = 0
    Dim objFSO, objFile, strg, objADODBStream
    Dim args, arg1, arg2

    If WScript.Arguments.Count = 0 Then
       WScript.Echo "No argument on the command line."
       WScript.Echo "usage: Ansi2UniCode_UTF-8.vbs SourceFile TargetFile"
       WScript.Quit
    End If

    Set args = WScript.Arguments
    arg1 = args.Item(0)
    arg2 = args.Item(1)

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(arg1, ForReading, False, TristateFalse)
    strg = objFile.ReadAll()
    objFile.Close
    Set objFile = Nothing

    Set objADODBStream = CreateObject("ADODB.Stream")
    objADODBStream.Charset = "UTF-8"
    objADODBStream.Open
    objADODBStream.WriteText strg
    objADODBStream.SaveToFile arg2, 2
    objADODBStream.Close
    Set objADODBStream = Nothing
    ----------copy-inside-only----------

  3. 存檔,檔名為 Ansi2UniCode_UTF-8.vbs
  4. 再建立一個 Excel 檔案:簡體2UniCode_UTF-8.xls
  5. Excel 內容如下

    A

    B

    C

    1

    檔案目錄 位置 C:\Ch05\  

    2

    轉碼程式 Ansi2UniCode_UTF-8.vbs  

    3

    檔案名稱清單(代轉) 檔案名稱清單(轉換) 開啟檔案的指令

    4

    ex5-1.php ex5-1_tc.php Ansi2UniCode_UTF-8.vbs C:\Ch05\ex5-1.php C:\Ch05\ex5-1_tc.php

    5

    ex5-10.php ex5-10_tc.php Ansi2UniCode_UTF-8.vbs C:\Ch05\ex5-10.php C:\Ch05\ex5-10_tc.php

  6. 其中 B4 儲存格內容為 =LEFT(A4,LEN(A4)-4) & "_tc" & RIGHT(A4,4)
    同理 B5 儲存格內容為 =LEFT(A5,LEN(A5)-4) & "_tc" & RIGHT(A5,4)
    以下類推,Excel 公式拉一下,就完成了。
  7. 那 C4, C5 儲存格內容,就會是

    C4

    =IF(A4="","",$B$2 & " " & $B$1 & A4 & " " & $B$1 &B4)

    C5

    =IF(A5="","",$B$2 & " " & $B$1 & A5 & " " & $B$1 &B5)

  8. 依照代轉檔案的數量(填在 A4 以下的位置),調整 B4、C4 以下的公式內容。記得要存檔。
  9. 接下來,要上演重頭戲:轉碼作業
    ● 在控制台中,改變 中文(PRC)
    ● 重新開機
    ● 開啟 命令列 (cmd.exe)
    ● 變更現行目錄到 Ansi2UniCode_UTF-8.vbs 存檔的目錄中
    ● 再開啟 Excel 檔 簡體2UniCode_UTF-8.xls ,並選取 C4 以下的內容,Copy。
    ● 回到命令列視窗中,貼上剛才複製的處理指令,就可以在 檔案目錄位置(B2內容) 中的目錄,
        看到新產生的文字檔,它們的檔案格式就會是 UTF-8

文字檔 *.txt 儲存成 UTF-8 格式 (2)

假若你,使用 記事本(NotePad) 程式來打開文字檔,並以另存新檔方式儲存時,
就會下圖範例,

[image[1].png]

接下來看看範例圖示中的編碼選項,分別有 ANSI、Unicode、Unicode big endian、UTF-8 四種。

其中 Unicode 就是 UTF-16 (一般所說的 Unicode),
而    Unicode big endian 簡稱 UTF-16BE。

了解這些後,再來看下,若是要將一文字檔轉存成 UTF-8 格式,可以有那些方法?

  1. 手動方式:以 NotePad (記事本) 開啟檔案,再另存新檔(SaveAs),並修正編碼為 UTF-8。
  2. 程式異動:(適用多數檔案需要轉換的情況)
    ● Scripting.FileSystemObject (不能存成 UTF-8 格式,只能存成 Unicode格式,即 UTF-16)
    ● ADODB.Stream (可以存成 UTF-8 格式)

注意:以上的方式,一定要記得先將電腦設定 改成 中文(PRC) ,才能看到正常的簡體文件內容,再來做轉換工作。

文字檔 *.txt 儲存成 UTF-8 格式 (1)

文字檔 *.txt 存檔時,一般都是以 ANSI 的編碼格式來儲存。
但是,要注意的是,這時儲存的文字檔內容,將是和存檔電腦的環境設定有關。
因此會遇到打開文字檔,卻只看到一片亂碼而不是正常的中文字情形。

也是因為這樣,所以在地球村、世界大同的INTERNET,就掀起使用 UniCode 格式的浪潮。
但是實務上來說,網頁現今都是存成 UTF-8 格式。
至於 UTF-16、UTF-16LE、UTF-16BE、UTF-32.. 就較少被使用。

image

對於 UniCode 相關議題可以參考 UTF-8 & Unicode 迷思 一文。

接下來,更細緻說明一下,上文提及"這時儲存的文字檔內容,將是和存檔電腦的環境設定有關。"的意思;使用電腦的人多會了解,他是在打繁體中文還是簡體中文,即便是同一個中文字在簡繁體中是相同的字樣
(例如:中,簡繁同字;國,這字就呈現出[繁]、[簡]),
但是它被存檔時,就會和存檔電腦的環境設定有關。

有興趣的讀者,可以在下列指令中,看到設定值

開始 / 控制台 / 地區及語言選項 / 進階

image <== 這是 繁體電腦 的設定

image <== 這是 简体電腦 的設定

 

看的這些,各位看官是不是有想到,如果你打開一份來自簡體地區的文件檔,結果是亂碼一片,應該知道要如何應變了吧 !!

UTF-8 & Unicode 迷思

平時,使用電腦打中文文件是很輕鬆平常的事情,也不覺得有什麼困難;早以習以為常的事,就不會再深入了解其中的知識。(也可能是太平常了,習慣了,也不知道要如何深入了解相關的知識與提出問題)
一直到網頁設計上的需要及有時會用到"簡體"內容的檔案碰到瓶頸時,才知道是要真正了解什麼是 Unicode 的時候了 !!

以往的學習中, 只知道 Unicode 可以讓簡體正常呈現在繁體電腦的環境中,也可以讓簡、繁體或是世界各國的語言文字(如日文、阿拉伯文、法文、韓文 …)顯示在同一個檔案中。

想不到 Unicode 還可以再細分成:

  1. UTF-8
  2. UTF-16
  3. UTF-16 Big Endian(簡稱 UTF-16BE)
  4. UTF-16 Little Endian(簡稱 UTF-16LE,也是一般所說的 Unicode)
  5. UTF-32
  6. UTF-32 Big Endian(簡稱 UTF-32BE)
  7. UTF-32 Little Endian(簡稱 UTF-32LE)

上述各分類會因編碼規格的不同,而會有檔案大小不同的情形。
● Unicode transformation format (UTF)
● Byte Order Mark (BOM)
通用字符集 Universal Character Set (UCS)
● 基本多語言平面 Basic Multilingual Plane (BMP)
● Most Significant Byte (MSB)
● Least Significant Byte (LSB)
● Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。
UCS可以看作是"Unicode Character Set"的縮寫。

其中,Little Endian 和 Big Endian 與檔案大小無關,而是資料 byte order 的差異,也就是高位元組(MSB)放前面或是低位元組(LSB)放前面差異。
例如:
內碼:1234h(0x1234)而言,高位元組是 0x12,低位元組是 0x34
在記憶體內的存放順序,若是Little Endian則為:0x340x12,Big Endian則為0x120x34
例如:
「漢」字的Unicode編碼是0x6C49。那麼寫到文件裡時,究竟是將0x6C寫在前面,還是將0x49寫在前面?
如果將0x6C寫在前面,就是Big Endian。
還是將0x49寫在前面,就是Little Endian。

UTF-8以字元為編碼單元,沒有字元序的問題。
UTF-16以兩個字元為編碼單元
在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF
FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。
UCS規範建議我們在傳輸字元流前,先傳輸字元"ZERO WIDTH NO-BREAK SPACE"。
如果收到FEFF,就表明這個字元流是Big-Endian;
如果收到FFFE,就表明這個字元流是Little-Endian。

UTF-8不需要BOM來表明字元順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是 EF BB BF。所以如果接收者收到以EF BB BF開頭的字元流,就知道這是UTF-8編碼了。

Summarizes of the properties of each UTFs

Name UTF-8 UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE
Smallest code point 0000 0000 0000 0000 0000 0000 0000
Largest code point 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF
Code unit size 8 bits 16 bits 16 bits 16 bits 32 bits 32 bits 32 bits
Byte order N/A <BOM> Big-Endian Little-Endian <BOM> Big-Endian Little-Endian
Fewest bytes per character 1 2 2 2 4 4 4
Most bytes per character 4 4 4 4 4 4 4