2017-09-06 20 views
0

ANSI에서 유니 코드로 변환하는 데 문제가 있습니다. 다음 코드는 내가하는 일을 설명합니다. 내가의 0x57 오류를 얻고있다 .. 좀 더 인수가 ByVal 키워드와 함께 전달 될 필요가QB64의 WideCharToMultiByte

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 

답변

1

: 그 외에

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 중 하나에 null 종료 입력이 필요하지 않음을 의미합니다. 따라서 byteCountccWideChar 매개 변수가 존재하며, 일부는 문자열에서만 작동하기를 원합니다. 당신은 당신이, INPUTLINE INPUT는 나머지 바이트가 명시 적으로 (CHR$(32)Filename에 입력되지 채울 것 ASCIIZ 문자열을 사용하여 일을 처리 할 수 ​​있도록 0으로 Filename의 모든 바이트를 설정 _MEMFILL를 사용하는 경우에도

더 나쁜, 즉 빈 공간 스페이스 바를 누른 것처럼). 예를 들어 "Hello"를 입력하면 입력 된 문자열에는 5 바이트, 문자 코드 32는 255 바이트 (16 진수를 선호하는 경우 &H20)가됩니다.

이 끔찍한 두통 ("hello world.bas"는 유효한 파일명입니다!)을 저장하려면 STRING * 260이 아니라 STRING을 사용하고 싶을 것입니다. 길이가 260보다 길면 오류 메시지를 인쇄해야합니다. 사용자가 새 파일 이름을 입력하도록 허용 할 것인지 여부를 결정합니다.

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) 

... 
+0

좋아, 다시 한번 감사 : 그것은 NewFilename의 문자 수이기 때문에

는 또한 MultiByteToWideChar의 반환 값을 사용할 수 있습니다. 그게 단지 잠시 동안 내가 함께 모든 코드를 조각에 대해해야합니다 .. – eoredson

+0

왜 : FindFirstFileW 반환합니다. cAlternateFilename NUL로? – eoredson

+1

docs는'cAlternateFilename'이 이미 8.3 파일 이름이 아닌 한 DOS 8.3 형식 파일 이름이'cAlternateFilename'에있을 것이라고 말합니다.이 경우'cAlternateFilename'은 빈 문자열입니다. 예를 들어,'foo.txt'는 빈'cAlternateFilename' 멤버가되고, 반면에'HelloWorld.txt'와'foo.config'는'HelloW ~ 1.txt'와'foo ~ 7.con'이 될 것입니다. –