31 Mayıs 2018 Perşembe

std::wcout

Giriş
Açıklaması şöyle.
The Windows Console does not support UTF-16 output. It only supports 8-bit output, and it has partial support for 8-bit MBCS, such as Big5 or UTF-8.

To display Unicode characters on the console you will need to do conversion to UTF-8 or another MBCS in your code, and also put the console into UTF-8 mode (which requires an undocumented system call).
Dolayısıyla her wchar_t karakterini gösteremez. Bazı karakterin gösterilmediğini görmek için şöyle yaparız.
#include <cstring>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
  wchar_t c[] = L"olé";
  wchar_t d[] = L"abc";
  wcout << c << endl;
  wcout << d << endl;

  return 0;
}
Unicode Karakter Göstermek
Windows'ta şöyle yapılır
#include <iostream>
#include <io.h>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"—";
}


29 Mayıs 2018 Salı

std::get_time metodu

Giriş
Şu satırı dahil ederiz.
#include <iomanip>
Broken time yani std::tm yapısını stream'den okumak için kullanılır. Yani bu işlem sonunda tm değişkeni doldurulur. Bu sınıfın tam tersi işlemini std::put_time ile yaparız.

std::get_time C++11 ile gelen yeni bir metod.  std::get_time yerine hep strptime() metodunu kullanıyorduk.  Ancak bu metod Windows'ta mevcut değildi, dolayısıyla kod portable olmuyordu.

%d - day
/%m - month
/%Y - year
%H- hour
%M - minute
%S - second

Gün - Ay - Yıl - Saat - Dakika - Saniye
Şöyle yaparız.
struct tm          t = {};
std::string        dateTimeFormat{"%d/%m/%Y %H:%M:%S"};
std::istringstream ss("22/12/2016 01:12:10");

ss >> std::get_time( &t, dateTimeFormat.c_str() );
Yıl - Ay- Gün
Şöyle yaparız.
std::tm t = {};
std::istringstream ss ("2015-11-27");
if (ss >> std::get_time (&t, "%Y-%m-%d")) {...}
Yıl - Ay - Gün - Saat - Dakika - Saniye
Örnek
Şöyle yaparız. Herhangi bir doğrulama kontrolü yapılmaz.
std::string str = "2016-06-31 02:00:58"; // June 31 2016 does not exist
std::istringstream ss (str);
struct tm t = {}
if (ss >> std::get_time (&t, "%Y-%m-%d %H:%M:%S")) {...}
Örnek
Şöyle yaparız.
std::istringstream time_stream = ...;  // Construct a stream from string
std::tm time;  // Time structure
time_stream >> std::get_time(&time, "%Y-%m-%d %H:%M:%S");  // Fill time struct
Yıl - Ay - Gün - T - Saat - Dakika - Saniye
Elimizde UTC bir zaman olsun. Şöyle yaparız.
std::tm t = {};
std::istringstream ss ("2010-11-04T23:23:01Z");
if (ss >> std::get_time (&t, "%Y-%m-%dT%H:%M:%S")) {...}
Saat - Dakika - Saniye
Şöyle yaparız.
std::tm t{};
std::istringstream ss("01:02:03");
ss.imbue(std::locale("de_DE"));
ss >> std::get_time(&t, "%H:%M:%S");
std::cout << ss.fail() << std::endl;
std::cout << std::put_time(&t, "%c") << '\n';
Çıktı olarak şunu alırız.
1
Sun Jan  0 00:00:00 1900
tm yapısından chrono'ya geçiş
Chrono ile gelen from_time_t() metodunu kullanırız. Şöyle yaparız.
std::tm tm;
std::stringstream ss("Jan 9 2014 12:35:34");
ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");
auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));




21 Mayıs 2018 Pazartesi

std::u32string Sınıfı

Giriş
Bu sınıf aslıdna std::basic_string<char32_t> olarak tanımlı. std::wstring'den daha portable

std::wstring Sınıfı

Giriş
std::wstring wchar_t tipini kullanır. Bu tipin büyüklüğü Windows'ta 16 bit, Mac OS ta 32 bit tip.

Dolayısıyla  std::wstring portable kodlara sebep olmuyor. Açıklaması şöyle.
Do not use std::wstring if you care about portability (wchar_t is only 16 bits on Windows); use std::u32string instead (aka std::basic_string<char32_t>).
tchar - Windows
Windows'ta hem Unicode hem de MCBS çalışmak istersek tchar kullanmak gerekir. Şu satırı dahil ederiz.
#include <tchar.h>
Bu durumda TCHAR tipini kullanabiliriz.
TCHAR> c = ...
_T("...") macrosunu kullanabilir.
_T("MTS");
LPCTSTR yapısını kullanabiliriz.
LPCTSTR p = ...
Constructor
Windows'ta şöyle yaparız.
std::wstring str = L"MTS";
Windows'ta std::wstring ile std::basic_string<WCHAR> aynı şeydir. Şöyle yaparız.
std::basic_string<WCHAR> str = L"MTS";
Windows'ta tchar kullanmak istersek şöyle yaparız.
std::basic_string<TCHAR> str = _T("MTS");
c_str metodu
Windows'ta şöyle yaparız.
LPCWSTR b = str.c_str();
Windows'ta tchar kullanmak istersek şöyle yaparız.
LPCTSTR b = str.c_str();
Diğer - MultiByteToWideChar
Windows'ta şöyle yapabiliriz.
std::wstring A2T(const std::string& str)
{
  if (str.empty())
    return std::wstring();
  int sz = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0);

  std::wstring res(sz - 1, 0);
  //                  ^^^ count to "remove" the NULL
  MultiByteToWideChar(CP_UTF8, 0, &str[0], str.size(), &res[0], res.size());
  //                                       ^^^ use actual sizes
  return res;
}