Thanks for your attention! I really understand this time.But I still have a question,why dirname in linux glib doesn't process MBCS? Maybe they think input as UTF-8 as default? LIU Hao <lh_mo...@126.com> 于2023年3月23日周四 13:30写道:
> 在 2023-03-22 13:40, 傅继晗 写道: > > Hello: > > There is no need to convert multi-byte characters to wide-byte > characters and then convert from > > wide-byte to multi-byte, just deal with multi-byte directly as > __xpg_basename in gnu as this: > > glibc/xpg_basename.c at master · lattera/glibc (github.com) > > <https://github.com/lattera/glibc/blob/master/stdlib/xpg_basename.c> > > Converting multi-byte characters to wide-byte characters can lead to > garbled code problems if the > > incoming filename encoding does not match the system default encoding > returned by GetACP().And > > environment variables do not work there. > > I was also thinking about reimplementation of these functions, but there > are things that we must > take care of: > > 1. The conversion from multibyte character strings (MBCS) to wide character > strings (WCS) is necessary, because non-leading bytes in some MBCS > encodings > may match the black slash `\` (U+005C). > > 2. Not only forward and backward slashes are path separators. The > conventional > Shift JIS encoding has the Yen symbol `¥` (U+00A5) take the place of > the > ASCII backslash, and a Yen symbol is displayed for the byte 0x5C if a > Shift > JIS locale is activated. This means that `mbstowc()` will convert the > string > "a¥b" (hex: 61 5C 62) to L"a¥b" (hex: 0061 00A5 0062) and we have to > also > accept `¥` as a path separator in Japanese locales. > > 3. Something similar to 2 happens about the Won symbol `₩` (U+20A9) in > Korean > locales, so we have to accept it, too. > > 4. Don't ever try to modify the global locale, due to thread safety. > > > OK, it has been too much. How do we implement this correctly? First we > need to make an assumption > about the input, for example, let's assume it is a path in Shift JIS > encoding. > > 1. Don't check wide characters for path separators! As explained above, > not only > slashes are path separators. Japanese and Korean are what I happen to > know, > but there could be a couple more. We notice that the byte 5C is always > a path > separator, no matter what it may map to, `\`, `¥` or `₩`. Hence, only > the > original MBCS should be scanned for path separators, which are `/` > (U+002F) > and `\` (U+005C), but nothing else. > > 2. It's necessary to convert it to a WCS first. Ideally the caller should > have > set the global locale... but are they aware of it? Maybe this should > be done > via `MultiByteToWideChar()`, like other functions. > > 3. So what is the conversion for? We can't make use of the output of such > conversion, but it gives information about how many bytes that a > character > takes in the original MBCS, so we can know how many bytes to move > forward (a > multiple-byte character is never a path separator), and will not a > mistake > non-leading byte as a path separator. > > > > -- > Best regards, > LIU Hao > > _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public