2013-04-30 157 views
1

我想使用打印機(Windows驅動程序)在vb 6項目中打印日文。Vb6打印機對象打印日文

我的項目是在日文Windows環境下(操作系統是英文原文,設置日本地區和相關語言)。

我使用打印機對象打印的日本簡單字符串類型,比如「レジースター」,代碼等

Dim s As String 
    s="レジースター" 
    Printer.Print s 
    Printer.EndDoc 

但輸出結果是一組的像亂碼「OEvƒOEƒ| [ ƒg」

有誰誰可以成功地日語的Windows環境不受VB6打印機對象打印出日本,請幫助我。

最後找到關鍵很簡單,這有點棘手,但我仍然不知道爲什麼。只需設置打印機對象的字體,如「Printer.Font.Charset = 128」(128爲日語)

ATTN:請注意我的情況,我的操作系統是英語,語言和地區設置爲日語。

讓我困惑的是Windows的默認ANSI。我們知道,Printer.Font.Charset的默認值是0,這意味着ANSI(如果語言環境是日語,那麼它將使用代碼頁932,如果它是英語,它將使用Windows-1252)。我的操作系統是日語(設置爲日語,而不是純粹的原始英語操作系統),當我嘗試用日語寫文件時可以顯示日語,但是當我使用打印機對象進行打印時,它確實有0( ANSI)的.Font.Charset值,但實際上它仍然使用原始的OS代碼頁,所以它是有線的。當我嘗試將系統設置爲中文和韓文時,這兩種語言都是正常的,只有日語有這個問題。

回答

0

儘管VB6中的所有字符串都是Unicode(UTF-16),但當涉及到與世界接口時,VB6完全是非Unicode的。

您不能將レジースター存儲在您的項目文件中,因爲該文件在ANSI中。
您不能簡單地將字符串傳遞給聲明的API函數,因爲它會首先經歷自動轉換爲ANSI。爲了避免這種情況,你必須將字符串參數聲明爲指針。

顯然,同樣的情況在Print呼叫 - 到達打印機驅動程序之前的字符串被轉換爲當期的ANSI代碼。

您可以嘗試通過creating a device contextprinting on it手動打印。

或者您可以search爲另一種解決方案,如this one(我沒有嘗試它)。

+0

感謝您的回覆,但我可以用日語存儲我的項目。我不知道是否因爲我的日文Windows環境。實際上,日語存儲在一個資源文件中,我加載資源文件並打印出來。我可以在中文環境中打印中文,但不能在日文環境中打印日文。我知道這可能是代碼頁問題,但我試圖將日文轉換爲Unicode,但它仍然不起作用... – 2013-04-30 10:47:17

+1

術語「ANSI」在Windows開發中以令人困惑的方式使用。它意味着Windows上的當前代碼頁。如果Windows設置「非Unicode程序的語言」設置爲日語,那麼當前代碼頁將是日語,而日語文本應該可以工作。在發送到打印機,寫入文件等之前,這些字符串將轉換爲日文代碼頁。 – MarkJ 2013-04-30 15:10:00

+0

感謝您的解釋,我已經看到了有關Vb6編碼的一些文檔。我知道vb6會自動將unicode轉換爲當前的ANSI。我嘗試了「將日文字符串寫入文件」和「打印輸出」。我可以在txt文件中顯示日文(寫入時),所以它應該是我當前的日文Windows代碼頁:932(日文Shift-JIS)(PS:我的操作系統是英文設置日文環境),但是當我嘗試使用打印機對象進行打印,它似乎由Windows 1252(我的英文操作系統默認代碼頁)編碼。我已經設置了正確的字體,我對此感到困惑。 – 2013-05-02 05:18:29

1

,我已經使用的是這樣的關鍵是使用雙中StrConv()函數,一個與vbFromUnicode常數和其它與vbToUnicode恆定。

它需要小有一點試驗,以得到正確的,但它應該是這個樣子,交換常數和/或代碼頁值,直到你找到正確的轉換爲你的系統

Dim s as string 
s="レジースター" 
Dim newS as string 
newS = StrConv((StrConv(s,FromUnicode,CodePage1),ToUnicode,CodePage2) 
Printer.Print newS 

代碼頁* N *是Windows代碼頁值1252英文版,932日文版

+0

謝謝你的回答,我試過了StrConv方法。當我的系統不是日語的時候,它起作用,我終於在我的大學的幫助下找到了答案。 – 2013-05-03 05:54:31