xref: /aosp_15_r20/external/pytorch/c10/util/Unicode.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Unicode.h>
2*da0073e9SAndroid Build Coastguard Worker 
3*da0073e9SAndroid Build Coastguard Worker namespace c10 {
4*da0073e9SAndroid Build Coastguard Worker #if defined(_WIN32)
u8u16(const std::string & str)5*da0073e9SAndroid Build Coastguard Worker std::wstring u8u16(const std::string& str) {
6*da0073e9SAndroid Build Coastguard Worker   if (str.empty()) {
7*da0073e9SAndroid Build Coastguard Worker     return std::wstring();
8*da0073e9SAndroid Build Coastguard Worker   }
9*da0073e9SAndroid Build Coastguard Worker   int size_needed = MultiByteToWideChar(
10*da0073e9SAndroid Build Coastguard Worker       CP_UTF8, 0, str.c_str(), static_cast<int>(str.size()), NULL, 0);
11*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK(size_needed > 0, "Error converting the content to Unicode");
12*da0073e9SAndroid Build Coastguard Worker   std::wstring wstr(size_needed, 0);
13*da0073e9SAndroid Build Coastguard Worker   MultiByteToWideChar(
14*da0073e9SAndroid Build Coastguard Worker       CP_UTF8,
15*da0073e9SAndroid Build Coastguard Worker       0,
16*da0073e9SAndroid Build Coastguard Worker       str.c_str(),
17*da0073e9SAndroid Build Coastguard Worker       static_cast<int>(str.size()),
18*da0073e9SAndroid Build Coastguard Worker       &wstr[0],
19*da0073e9SAndroid Build Coastguard Worker       size_needed);
20*da0073e9SAndroid Build Coastguard Worker   return wstr;
21*da0073e9SAndroid Build Coastguard Worker }
u16u8(const std::wstring & wstr)22*da0073e9SAndroid Build Coastguard Worker std::string u16u8(const std::wstring& wstr) {
23*da0073e9SAndroid Build Coastguard Worker   if (wstr.empty()) {
24*da0073e9SAndroid Build Coastguard Worker     return std::string();
25*da0073e9SAndroid Build Coastguard Worker   }
26*da0073e9SAndroid Build Coastguard Worker   int size_needed = WideCharToMultiByte(
27*da0073e9SAndroid Build Coastguard Worker       CP_UTF8,
28*da0073e9SAndroid Build Coastguard Worker       0,
29*da0073e9SAndroid Build Coastguard Worker       wstr.c_str(),
30*da0073e9SAndroid Build Coastguard Worker       static_cast<int>(wstr.size()),
31*da0073e9SAndroid Build Coastguard Worker       NULL,
32*da0073e9SAndroid Build Coastguard Worker       0,
33*da0073e9SAndroid Build Coastguard Worker       NULL,
34*da0073e9SAndroid Build Coastguard Worker       NULL);
35*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK(size_needed > 0, "Error converting the content to UTF8");
36*da0073e9SAndroid Build Coastguard Worker   std::string str(size_needed, 0);
37*da0073e9SAndroid Build Coastguard Worker   WideCharToMultiByte(
38*da0073e9SAndroid Build Coastguard Worker       CP_UTF8,
39*da0073e9SAndroid Build Coastguard Worker       0,
40*da0073e9SAndroid Build Coastguard Worker       wstr.c_str(),
41*da0073e9SAndroid Build Coastguard Worker       static_cast<int>(wstr.size()),
42*da0073e9SAndroid Build Coastguard Worker       &str[0],
43*da0073e9SAndroid Build Coastguard Worker       size_needed,
44*da0073e9SAndroid Build Coastguard Worker       NULL,
45*da0073e9SAndroid Build Coastguard Worker       NULL);
46*da0073e9SAndroid Build Coastguard Worker   return str;
47*da0073e9SAndroid Build Coastguard Worker }
48*da0073e9SAndroid Build Coastguard Worker #endif
49*da0073e9SAndroid Build Coastguard Worker } // namespace c10
50