// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "base/logging.h" #include "base/mac/scoped_cftyperef.h" #include "base/numerics/safe_conversions.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"; bool ConvertToUtf8(const std::string& text, const char* charset, std::string* output) { CFStringEncoding encoding; if (!CharsetToCFStringEncoding(charset, &encoding)) return false; base::ScopedCFTypeRef cfstring(CFStringCreateWithBytes( kCFAllocatorDefault, reinterpret_cast(text.data()), base::checked_cast(text.length()), encoding, false /* isExternalRepresentation */)); if (!cfstring) return false; *output = base::SysCFStringRefToUTF8(cfstring.get()); return true; } bool ConvertToUtf8AndNormalize(const std::string& text, const char* charset, std::string* output) { DCHECK(false) << "Not implemented yet."; return false; } bool ConvertToUTF16(const std::string& text, const char* charset, base::string16* output) { DCHECK(false) << "Not implemented yet."; return false; } bool ConvertToUTF16WithSubstitutions(const std::string& text, const char* charset, base::string16* output) { DCHECK(false) << "Not implemented yet."; return false; } bool ToUpper(const base::string16& str, base::string16* output) { base::ScopedCFTypeRef cfstring(base::SysUTF16ToCFStringRef(str)); base::ScopedCFTypeRef mutable_cfstring( CFStringCreateMutableCopy(kCFAllocatorDefault, 0, cfstring.get())); CFStringUppercase(mutable_cfstring.get(), NULL); *output = base::SysCFStringRefToUTF16(mutable_cfstring.get()); return true; } } // namespace net