xref: /aosp_15_r20/external/cronet/base/strings/utf_string_conversions.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_STRINGS_UTF_STRING_CONVERSIONS_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_STRINGS_UTF_STRING_CONVERSIONS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <string>
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/types/always_false.h"
16*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace base {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // These convert between UTF-8, -16, and -32 strings. They are potentially slow,
21*6777b538SAndroid Build Coastguard Worker // so avoid unnecessary conversions. The low-level versions return a boolean
22*6777b538SAndroid Build Coastguard Worker // indicating whether the conversion was 100% valid. In this case, it will still
23*6777b538SAndroid Build Coastguard Worker // do the best it can and put the result in the output buffer. The versions that
24*6777b538SAndroid Build Coastguard Worker // return strings ignore this error and just return the best conversion
25*6777b538SAndroid Build Coastguard Worker // possible.
26*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool WideToUTF8(const wchar_t* src, size_t src_len,
27*6777b538SAndroid Build Coastguard Worker                             std::string* output);
28*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::string WideToUTF8(std::wstring_view wide);
29*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool UTF8ToWide(const char* src, size_t src_len,
30*6777b538SAndroid Build Coastguard Worker                             std::wstring* output);
31*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::wstring UTF8ToWide(StringPiece utf8);
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool WideToUTF16(const wchar_t* src,
34*6777b538SAndroid Build Coastguard Worker                              size_t src_len,
35*6777b538SAndroid Build Coastguard Worker                              std::u16string* output);
36*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::u16string WideToUTF16(std::wstring_view wide);
37*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool UTF16ToWide(const char16_t* src,
38*6777b538SAndroid Build Coastguard Worker                              size_t src_len,
39*6777b538SAndroid Build Coastguard Worker                              std::wstring* output);
40*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::wstring UTF16ToWide(StringPiece16 utf16);
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool UTF8ToUTF16(const char* src,
43*6777b538SAndroid Build Coastguard Worker                              size_t src_len,
44*6777b538SAndroid Build Coastguard Worker                              std::u16string* output);
45*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::u16string UTF8ToUTF16(StringPiece utf8);
46*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool UTF16ToUTF8(const char16_t* src,
47*6777b538SAndroid Build Coastguard Worker                              size_t src_len,
48*6777b538SAndroid Build Coastguard Worker                              std::string* output);
49*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::string UTF16ToUTF8(StringPiece16 utf16);
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker // This converts an ASCII string, typically a hardcoded constant, to a UTF16
52*6777b538SAndroid Build Coastguard Worker // string.
53*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::u16string ASCIIToUTF16(StringPiece ascii);
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker // Converts to 7-bit ASCII by truncating. The result must be known to be ASCII
56*6777b538SAndroid Build Coastguard Worker // beforehand.
57*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::string UTF16ToASCII(StringPiece16 utf16);
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker #if defined(WCHAR_T_IS_16_BIT)
60*6777b538SAndroid Build Coastguard Worker // This converts an ASCII string, typically a hardcoded constant, to a wide
61*6777b538SAndroid Build Coastguard Worker // string.
62*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::wstring ASCIIToWide(StringPiece ascii);
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker // Converts to 7-bit ASCII by truncating. The result must be known to be ASCII
65*6777b538SAndroid Build Coastguard Worker // beforehand.
66*6777b538SAndroid Build Coastguard Worker [[nodiscard]] BASE_EXPORT std::string WideToASCII(std::wstring_view wide);
67*6777b538SAndroid Build Coastguard Worker #endif  // defined(WCHAR_T_IS_16_BIT)
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker // The conversion functions in this file should not be used to convert string
70*6777b538SAndroid Build Coastguard Worker // literals. Instead, the corresponding prefixes (e.g. u"" for UTF16 or L"" for
71*6777b538SAndroid Build Coastguard Worker // Wide) should be used. Catch those cases with overloads that assert at compile
72*6777b538SAndroid Build Coastguard Worker // time.
73*6777b538SAndroid Build Coastguard Worker template <size_t N>
WideToUTF16(const wchar_t (& str)[N])74*6777b538SAndroid Build Coastguard Worker [[noreturn]] std::u16string WideToUTF16(const wchar_t (&str)[N]) {
75*6777b538SAndroid Build Coastguard Worker   static_assert(AlwaysFalse<decltype(N)>,
76*6777b538SAndroid Build Coastguard Worker                 "Error: Use u\"...\" to create a std::u16string literal.");
77*6777b538SAndroid Build Coastguard Worker }
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker template <size_t N>
UTF8ToUTF16(const char (& str)[N])80*6777b538SAndroid Build Coastguard Worker [[noreturn]] std::u16string UTF8ToUTF16(const char (&str)[N]) {
81*6777b538SAndroid Build Coastguard Worker   static_assert(AlwaysFalse<decltype(N)>,
82*6777b538SAndroid Build Coastguard Worker                 "Error: Use u\"...\" to create a std::u16string literal.");
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker template <size_t N>
ASCIIToUTF16(const char (& str)[N])86*6777b538SAndroid Build Coastguard Worker [[noreturn]] std::u16string ASCIIToUTF16(const char (&str)[N]) {
87*6777b538SAndroid Build Coastguard Worker   static_assert(AlwaysFalse<decltype(N)>,
88*6777b538SAndroid Build Coastguard Worker                 "Error: Use u\"...\" to create a std::u16string literal.");
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker // Mutable character arrays are usually only populated during runtime. Continue
92*6777b538SAndroid Build Coastguard Worker // to allow this conversion.
93*6777b538SAndroid Build Coastguard Worker template <size_t N>
ASCIIToUTF16(char (& str)[N])94*6777b538SAndroid Build Coastguard Worker std::u16string ASCIIToUTF16(char (&str)[N]) {
95*6777b538SAndroid Build Coastguard Worker   return ASCIIToUTF16(StringPiece(str));
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker }  // namespace base
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker #endif  // BASE_STRINGS_UTF_STRING_CONVERSIONS_H_
101