Overview
Artifact ID: | 8a0d7c72704f06cc4df73edd885cc0ec30c369c9 |
---|---|
Ticket: | d17d6e5b174bd6f8bbe8be6f851de3d721190af8
Handle file names containing brackets, interrogation mark or asterisk |
User & Date: | anonymous 2012-11-20 15:18:47 |
Changes
- Appended to comment:
<hr /><i>anonymous added on 2012-11-20 15:18:47 UTC:</i><br /> char *fossil_unicode_to_utf8(void *zUnicode){ #ifdef _WIN32 int nByte = 0; char *zUtf; WCHAR *wUnicode = zUnicode; /* This my have problem when zUnicode is readonly. And it's will modify zUnicode when sometimes we did not want to modify it. */ while( *wUnicode != 0 ){ if ( (*wUnicode > 0xF000) && (*wUnicode <= 0xF07F) ){ *wUnicode &= 0x7F; } ++wUnicode; } nByte = WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, 0, 0, 0, 0); zUtf = sqlite3_malloc( nByte ); if( zUtf==0 ){ return 0; } WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, zUtf, nByte, 0, 0); return zUtf; #else return (char *)zUnicode; /* No-op on unix */ #endif } void *fossil_utf8_to_unicode(const char *zUtf8){ #ifdef _WIN32 /* nWord should be meaningful than nByte here*/ int nByte = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0); wchar_t *zUnicode = sqlite3_malloc( nByte * 2 ); wchar_t *wUnicode; if( zUnicode==0 ){ return 0; } MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nByte); wUnicode = zUnicode; while( --nByte > 0){ if ( (*wUnicode < 32) || wcschr(L"\"*<>?|", *wUnicode) ){ *wUnicode |= 0xF000; } ++wUnicode; } return zUnicode; #else return (void *)zUtf8; /* No-op on unix */ #endif }