diff options
author | jshin@chromium.org <jshin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 22:48:16 +0000 |
---|---|---|
committer | jshin@chromium.org <jshin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 22:48:16 +0000 |
commit | 5420bc1e4fa6d861107a5c847843ac7bd25fb3c4 (patch) | |
tree | 7cf5fdfbbb128ec57462450e3c7167e017351bfd /base/string_util.h | |
parent | 8f82f9d9ae8dfd23ab63fb9e63c6246da71d29fd (diff) | |
download | chromium_src-5420bc1e4fa6d861107a5c847843ac7bd25fb3c4.zip chromium_src-5420bc1e4fa6d861107a5c847843ac7bd25fb3c4.tar.gz chromium_src-5420bc1e4fa6d861107a5c847843ac7bd25fb3c4.tar.bz2 |
Fix the local directory listing, FTP directory listing and the local file handling (drag'n'drop and opening from the file list).
For the local file listing, use the OS file system encoding.
For the FTP directory listing, use ICU's encoding detector.GetDirectoryListingEntry and GetDirectoryLisingHeader were changed to accept string16 for file/directory names. To the former, a new parameter (|raw_bytes|) was added. It can be used to make a FTP request to a file with a non-ASCII name encoded in a legacy encoding.
For the local file handling on Windows, get rid of the code for 'doubly converted' UTF-8 in FileURLToFilePath, which led to issue 4619 and add a few cases to NetUtil*.FileURLConversion* test.
In addition, add
CodepageToUTF16 and UTF16ToCodepage along with a new unittest (ConvertBetweenCodepageAndUTF16) that shares the same set of case as ConvertBetweenCodepageAndWide. The test cases were expanded and revised a bit.
BUG=2939,13229,4619
http://crbug.com/2939 http://crbug.com/13229 http://crbug.com/4619
TEST=1. Pass URLRequest*.FTP* (net_unittests)
2. Pass StringUtiltTest.ConvertBetweenCode*
3. Pass NetUtil*.GetDirectoryLis* (net_unittests)
4. Open a local directory containing files with non-ASCII names and they're displayed correctly in the directory list. On Windows and Mac OS X, it should always work. On Linux, your locale encoding (as returned by nl_langinfo(CODESET)) should match the actual encoding used in your filename.
5a. Pass NetUtil*.FileURL* (net_unittests) with the default codepage set to 1252 and 932.
5b. Make a file named 'caf챕.txt' on Windows and see if it can be opened both by clicking in the directory listing page of Chrome and by drag'n'drop. Test this with the default OS code pages set to Windows-1252, Windows-1251 (Russian) and Windows-932 (Japanese).
Review URL: http://codereview.chromium.org/151065
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20331 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/string_util.h')
-rw-r--r-- | base/string_util.h | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/base/string_util.h b/base/string_util.h index 9a033b4..c7f3115 100644 --- a/base/string_util.h +++ b/base/string_util.h @@ -221,7 +221,8 @@ std::string UTF16ToUTF8(const string16& utf16); # define UTF16ToWideHack UTF16ToWide #endif -// Defines the error handling modes of WideToCodepage and CodepageToWide. +// Defines the error handling modes of UTF16ToCodepage, CodepageToUTF16, +// WideToCodepage and CodepageToWide. class OnStringUtilConversionError { public: enum Type { @@ -231,12 +232,30 @@ class OnStringUtilConversionError { // The offending characters are skipped and the conversion will proceed as // if they did not exist. SKIP, + + // When converting to Unicode, the offending byte sequences are substituted + // by Unicode replacement character (U+FFFD). When converting from Unicode, + // this is the same as SKIP. + SUBSTITUTE, }; private: OnStringUtilConversionError(); }; +// Converts between UTF-16 strings and the encoding specified. If the +// encoding doesn't exist or the encoding fails (when on_error is FAIL), +// returns false. +bool UTF16ToCodepage(const string16& utf16, + const char* codepage_name, + OnStringUtilConversionError::Type on_error, + std::string* encoded); + +bool CodepageToUTF16(const std::string& encoded, + const char* codepage_name, + OnStringUtilConversionError::Type on_error, + string16* utf16); + // Converts between wide strings and the encoding specified. If the // encoding doesn't exist or the encoding fails (when on_error is FAIL), // returns false. |