从ANSI转换到Unicode和back有问题。下面的代码片段描述了我正在做的事情。我得到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发布于 2017-09-06 04:24:06
需要使用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)不会按预期工作,而不是MultiByteToWideChar或WideCharToMultiByte都需要以空结尾的输入(这就是byteCount和ccWideChar参数存在的原因;有时您只想对字符串的一部分进行操作)。
更糟糕的是,即使使用_MEMFILL将Filename的所有字节设置为0以允许您处理使用ASCIIZ字符串处理的事情,INPUT和LINE INPUT也会填充未显式输入到CHR$(32)中的任何剩余字节(例如,空格按下空格)。例如,如果输入"Hello",则输入的字符串有5个字节,字符代码为32 (如果您喜欢十六进制,则为255个字节)。
为了避免这个可怕的头痛("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)
...https://stackoverflow.com/questions/46065899
复制相似问题