@@ -378,6 +378,10 @@ fn utf16_to_utf8(utf16: &[u16], utf8: &mut [u8]) -> io::Result<usize> {
378
378
return Ok ( 0 ) ;
379
379
}
380
380
381
+ #[ cfg( target_vendor = "rust9x" ) ]
382
+ let is_nt = crate :: sys:: compat:: checks:: is_windows_nt ( ) ;
383
+
384
+ #[ cfg( not( target_vendor = "rust9x" ) ) ]
381
385
let result = unsafe {
382
386
c:: WideCharToMultiByte (
383
387
c:: CP_UTF8 , // CodePage
@@ -390,6 +394,39 @@ fn utf16_to_utf8(utf16: &[u16], utf8: &mut [u8]) -> io::Result<usize> {
390
394
ptr:: null_mut ( ) , // lpUsedDefaultChar
391
395
)
392
396
} ;
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
+
393
430
if result == 0 {
394
431
// We can't really do any better than forget all data and return an error.
395
432
Err ( io:: const_io_error!(
0 commit comments