Index: net/base/net_string_util_icu_alternatives_ios.mm |
diff --git a/net/base/net_string_util_icu_alternatives_ios.mm b/net/base/net_string_util_icu_alternatives_ios.mm |
index 7ea42808359318738151429e1be3f707798bccaa..5470437ff22f19609bc069aa40549e1b74b87bad 100644 |
--- a/net/base/net_string_util_icu_alternatives_ios.mm |
+++ b/net/base/net_string_util_icu_alternatives_ios.mm |
@@ -2,13 +2,34 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <CoreFoundation/CoreFoundation.h> |
+ |
#include "base/logging.h" |
+#include "base/mac/scoped_cftyperef.h" |
#include "base/strings/string16.h" |
#include "base/strings/string_piece.h" |
+#include "base/strings/sys_string_conversions.h" |
#include "net/base/net_string_util.h" |
namespace net { |
+namespace { |
+ |
+bool CharsetToCFStringEncoding(const char* charset, |
+ CFStringEncoding* encoding) { |
+ if (charset == kCharsetLatin1 || strcmp(charset, kCharsetLatin1) == 0) { |
+ *encoding = kCFStringEncodingISOLatin1; |
+ return true; |
+ } |
+ // TODO(mattm): handle other charsets? See |
+ // https://developer.apple.com/reference/corefoundation/cfstringbuiltinencodings?language=objc |
+ // for list of standard CFStringEncodings. |
+ |
+ return false; |
+} |
+ |
+} // namespace |
+ |
// This constant cannot be defined as const char[] because it is initialized |
// by base::kCodepageLatin1 (which is const char[]) in net_string_util_icu.cc. |
const char* const kCharsetLatin1 = "ISO-8859-1"; |
@@ -16,8 +37,18 @@ const char* const kCharsetLatin1 = "ISO-8859-1"; |
bool ConvertToUtf8(const std::string& text, |
const char* charset, |
std::string* output) { |
- DCHECK(false) << "Not implemented yet."; |
- return false; |
+ CFStringEncoding encoding; |
+ if (!CharsetToCFStringEncoding(charset, &encoding)) |
+ return false; |
+ |
+ base::ScopedCFTypeRef<CFStringRef> cfstring(CFStringCreateWithBytes( |
+ kCFAllocatorDefault, reinterpret_cast<const UInt8*>(text.data()), |
+ base::checked_cast<CFIndex>(text.length()), encoding, |
+ false /* isExternalRepresentation */)); |
+ if (!cfstring) |
+ return false; |
+ *output = base::SysCFStringRefToUTF8(cfstring.get()); |
+ return true; |
} |
bool ConvertToUtf8AndNormalize(const std::string& text, |
@@ -41,4 +72,4 @@ bool ConvertToUTF16WithSubstitutions(const std::string& text, |
return false; |
} |
-} // namespace net |
+} // namespace net |