WideCharToMultiByte in QB64



正在从ANSI转换为Unicode和背部的问题。以下代码剪辑描述了我在做什么。我遇到0x57错误..

DECLARE DYNAMIC LIBRARY "kernel32"
    FUNCTION MultiByteToWideChar& (codePage~&, dwFlags~&, lpszMbstring$, byteCount&, lpwszWcstring$, wideCount&)
    FUNCTION WideCharToMultiByte& (codePage~&, dwFlags~&, lpWideString$, BYVAL ccWideChar%, lpMultiByte$, BYVAL multibyte%, BYVAL defaultchar&, BYVAL usedchar&)
    FUNCTION GetLastError& ()
END DECLARE
DIM Filename AS STRING * 260, NewFilename AS STRING * 260, MultiByte AS STRING * 260
PRINT "Enter filename";: INPUT Filename$: 'Filename$ = Filename$ + CHR$(0)
x = MultiByteToWideChar(0, 0, Filename$, LEN(Filename$), NewFilename$, 260)
IF x = 0 THEN
    PRINT "Error 0x"; HEX$(GetLastError)
ELSE
    PRINT "Processing: "; NewFilename$
END IF
' do unicode stuff here
x = WideCharToMultiByte(65001, 0, NewFilename$, LEN(NewFilename$), MultiByte$, 0, 0, 0)
' display processed filename
IF x = 0 THEN
    PRINT "Error 0x"; HEX$(GetLastError)
ELSE
    PRINT MultiByte$
END IF

还需要使用byval关键字传递更多的args:

FUNCTION MultiByteToWideChar& (BYVAL codePage~&, BYVAL dwFlags~&, lpszMbstring$, BYVAL byteCount&, lpwszWcstring$, BYVAL wideCount&)
FUNCTION WideCharToMultiByte& (BYVAL codePage~&, BYVAL dwFlags~&, lpWideString$, BYVAL ccWideChar%, lpMultiByte$, BYVAL multibyte%, BYVAL defaultchar&, BYVAL usedchar&)

除此之外,不管存储的任何值如何,STRING * 260的长度始终为260。这意味着Filename = Filename + CHR$(0)无法按预期工作,而不是MultiByteToWideCharWideCharToMultiByte中的CC_4都需要null终止输入(这就是byteCountccWideChar参数存在的原因;有时您只想在字符串的一部分上操作)。

)。 )。

更糟糕的是,即使您使用_MEMFILLFilename的所有字节设置为0到0,以允许您使用ASCIIZ字符串处理事物,INPUTLINE INPUT也会填充任何未明确输入Filename的剩余字节(即一个空白空间)如果按下空格键)。例如,如果输入" Hello",则输入字符串将有5个字节,而字符代码为255个字节32(或&H20,如果您喜欢六核)。

为了节省这种可怕的头痛(" hello world.bas"是一个有效的文件名!),您需要使用STRING,而不是STRING * 260。如果长度大于260,则可能应该打印一条错误消息。是否允许用户输入新的文件名之后取决于您。

您还需要使用MultiByteToWideChar的返回值,因为它是NewFilename中的字符数:

DIM Filename AS STRING
DIM NewFilename AS STRING * 260
DIM MultiByte AS STRING * 260
...
' Note: LEN(NewFilename) = 260 (**always**)
' This is why the number of wide chars written
' is saved.
NewFilenameLen = MultiByteToWideChar(0, 0, Filename, LEN(Filename), NewFilename, LEN(NewFilename))
...
' Note: LEN(MultiByte) = 260 (**always**)
x = WideCharToMultiByte(65001, 0, NewFilename, NewFilenameLen, MultiByte, LEN(MultiByte), 0, 0)
...

相关内容

  • 没有找到相关文章

最新更新