2013-04-30 171 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