@@ -378,6 +378,10 @@ fn utf16_to_utf8(utf16: &[u16], utf8: &mut [u8]) -> io::Result<usize> {
378378 return Ok ( 0 ) ;
379379 }
380380
381+ #[ cfg( target_vendor = "rust9x" ) ]
382+ let is_nt = crate :: sys:: compat:: checks:: is_windows_nt ( ) ;
383+
384+ #[ cfg( not( target_vendor = "rust9x" ) ) ]
381385 let result = unsafe {
382386 c:: WideCharToMultiByte (
383387 c:: CP_UTF8 , // CodePage
@@ -390,6 +394,39 @@ fn utf16_to_utf8(utf16: &[u16], utf8: &mut [u8]) -> io::Result<usize> {
390394 ptr:: null_mut ( ) , // lpUsedDefaultChar
391395 )
392396 } ;
397+
398+ #[ cfg( target_vendor = "rust9x" ) ]
399+ let result = {
400+ let mut result = unsafe {
401+ c:: WideCharToMultiByte (
402+ c:: CP_UTF8 , // CodePage
403+ if is_nt { c:: WC_ERR_INVALID_CHARS } else { 0 } , // dwFlags
404+ utf16. as_ptr ( ) , // lpWideCharStr
405+ utf16. len ( ) as i32 , // cchWideChar
406+ utf8. as_mut_ptr ( ) , // lpMultiByteStr
407+ utf8. len ( ) as i32 , // cbMultiByte
408+ ptr:: null ( ) , // lpDefaultChar
409+ ptr:: null_mut ( ) , // lpUsedDefaultChar
410+ )
411+ } ;
412+
413+ if result == 0 && unsafe { c:: GetLastError ( ) } == c:: ERROR_INVALID_FLAGS && is_nt {
414+ result = unsafe {
415+ c:: WideCharToMultiByte (
416+ c:: CP_UTF8 , // CodePage
417+ 0 , // dwFlags (0 for pre-Vista compatibility)
418+ utf16. as_ptr ( ) , // lpWideCharStr
419+ utf16. len ( ) as i32 , // cchWideChar
420+ utf8. as_mut_ptr ( ) , // lpMultiByteStr
421+ utf8. len ( ) as i32 , // cbMultiByte
422+ ptr:: null ( ) , // lpDefaultChar
423+ ptr:: null_mut ( ) , // lpUsedDefaultChar
424+ )
425+ } ;
426+ }
427+ result
428+ } ;
429+
393430 if result == 0 {
394431 // We can't really do any better than forget all data and return an error.
395432 Err ( io:: const_io_error!(
0 commit comments