Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SDKString.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
7
8#include "SDKString.h"
9
10using namespace Stroika::Foundation;
12
13/*
14 ********************************************************************************
15 ******************************* Characters::SDK2Wide ***************************
16 ********************************************************************************
17 */
18#if !qTargetPlatformSDKUseswchar_t
19wstring Characters::SDK2Wide (span<const SDKChar> s)
20{
21#if qStroika_Foundation_Common_Platform_MacOS
22 static const CodeCvt<wchar_t> kCvt_{UnicodeExternalEncodings::eUTF8};
23 return kCvt_.Bytes2String<wstring> (as_bytes (s));
24#else
25 return CodeCvt<wchar_t>{locale{}}.Bytes2String<wstring> (as_bytes (s));
26#endif
27}
28wstring Characters::SDK2Wide (span<const SDKChar> s, AllowMissingCharacterErrorsFlag)
29{
30 constexpr auto kOptions_ = CodeCvt<wchar_t>::Options{.fInvalidCharacterReplacement = UTFConvert::Options::kDefaultMissingReplacementCharacter};
31#if qStroika_Foundation_Common_Platform_MacOS
32 static const CodeCvt<wchar_t> kCvt_{UnicodeExternalEncodings::eUTF8, kOptions_};
33 return kCvt_.Bytes2String<wstring> (as_bytes (s));
34#else
35 // If - as is not uncommon - kDefaultMissingReplacementCharacter is not representable in the current locale code page,
36 // then try something that will be. This API says 'AllowMissingCharacter....' - so allow it!
37 auto codeCvt = [&] () {
38 try {
39 return CodeCvt<wchar_t>{locale{}, kOptions_};
40 }
41 catch (...) {
42 auto o = kOptions_;
43 o.fInvalidCharacterReplacement = '?';
44 return CodeCvt<wchar_t>{locale{}, o};
45 }
46 }();
47 return codeCvt.Bytes2String<wstring> (as_bytes (s));
48#endif
49}
50#endif
51
52/*
53 ********************************************************************************
54 ******************************* Characters::Wide2SDK ***************************
55 ********************************************************************************
56 */
57#if !qTargetPlatformSDKUseswchar_t
58SDKString Characters::Wide2SDK (span<const wchar_t> s)
59{
60#if qStroika_Foundation_Common_Platform_MacOS
61 static const CodeCvt<wchar_t> kCvt_{UnicodeExternalEncodings::eUTF8};
62 return kCvt_.String2Bytes<SDKString> (s);
63#else
64 return CodeCvt<wchar_t>{locale{}}.String2Bytes<SDKString> (s);
65#endif
66}
67SDKString Characters::Wide2SDK (span<const wchar_t> s, AllowMissingCharacterErrorsFlag)
68{
69 constexpr auto kOptions_ = CodeCvt<wchar_t>::Options{.fInvalidCharacterReplacement = UTFConvert::Options::kDefaultMissingReplacementCharacter};
70#if qStroika_Foundation_Common_Platform_MacOS
71 static const CodeCvt<wchar_t> kCvt_{UnicodeExternalEncodings::eUTF8, kOptions_};
72 return kCvt_.String2Bytes<SDKString> (s);
73#else
74 return CodeCvt<wchar_t>{locale{}, kOptions_}.String2Bytes<SDKString> (s);
75#endif
76}
77#endif
CodeCvt unifies byte <-> unicode conversions, vaguely inspired by (and wraps) std::codecvt,...
Definition CodeCvt.h:118
nonvirtual STRINGISH Bytes2String(span< const byte > from) const
nonvirtual BLOBISH String2Bytes(span< const CHAR_T > from) const
basic_string< SDKChar > SDKString
Definition SDKString.h:38