7 Aralık 2017 Perşembe

wstring_convert - Çeşitli Kodekler Arasında Çevrim Yapar

wstring_convert Sınıfı
Giriş
Bu sınıf UTF-16 string'i UTF-8, MBCS gibi kodeklere çevirmek veya bu kodeklerden UTF-16 string oluşturmak için kullanılır.

from_bytes metodu
Örnek - UTF-8 to UTF-16
Şöyle yaparız.  std::u16string tipi döner.
std::string source;
...
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
std::u16string dest = convert.from_bytes(source);    
Örnek - UTF-8 to UTF-32
std::u32string tipi döner.

Örnek - UTF-16 to UTF-8
Şöyle yaparız.
std::u16string source;
...
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
std::string dest = convert.to_bytes(source);    
Örnek - MBCS to UTF-16 
MBCS -> UTF-16 çevrimi için şöyle yaparız
std::wstring_convert<std::codecvt<wchar_t,char,std::mbstate_t>> converter;
std::wstring outputUtf16 = converter.from(inputMBCS);
to_bytes metodu
Örnek
UTF-16 -> MBCS çevrimi için şöyle yaparız
std::wstring_convert<std::codecvt<wchar_t,char,std::mbstate_t>> converter;
std::wstring outputUtf16 = converter.to_bytes (inputUTF16);
Örnek
std::wstring'i std::string'e çevirir. Elimizde bir wstring olsun.
std::wstring wStr = ...;
Bu string'i UTF-8 olarak çevirip std::string'e şöyle ekleriz.
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::string wStrAsStr = converter.to_bytes(wStr);
std::string result = wStrAsStr + str;
Örnek
Bir başka örnekte 4 byte'lık tek bir unicode karakterini std::string'e şöyle çeviriyoruz.
#include <codecvt>
#include <locale>
#include <string>
#include <cassert>

int main() {
  std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> convert;
  std::string utf8 = convert.to_bytes(0x5e9);
  assert(utf8.length() == 2);
  assert(utf8[0] == '\xD7');
  assert(utf8[1] == '\xA9');
}
Windows
mbstowcs_s
mbstowcs_s yazısına taşıdım.

wcstombs_s metodu
wcstombs_s yazısına taşıdım.

Boost
Eğer C++11 kullanmıyorsak boost ile aynı şeyleri şöyle yaparız.

to_bytes benzeri
Tek bir unicode karakteri std::string'e şöyle çeviririz.
#include <boost/locale.hpp>

int main() {
  unsigned int point = 0x5e9;
  std::string utf8 = boost::locale::conv::utf_to_utf<char>(&point, &point + 1);
  assert(utf8.length() == 2);
  assert(utf8[0] == '\xD7');
  assert(utf8[1] == '\xA9');
}
from_bytes benzeri
Şöyle yaparız.
using namespace boost::locale;

//Convert UTF-8 string str to UTF-16
u16string utf16_str = conv::utf_to_utf<char16_t>(str);

//NFD normalise
locale utf16_locale = generator().generate("en_US.UTF-16");
u16string normalised = normalize(utf16_str, norm_nfd, utf16_locale);





Hiç yorum yok:

Yorum Gönder