文字コード変換

  • ユニコード文字列←→マルチバイト文字列の変換で、mbstowcs_s, wcstombs_s を使う時は、その前に setlocaleコードページを指定する。
  • ロケール指定文字列は、Windows では "Japanese_Japan.932" または "Japanese"、Linux では "ja"。 0x80〜0xFFを漢字ではなくUS ASCIIと見なして変換したい場合は"English_USA.1252"を指定する。

ロケール設定を上書き

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
 
 
 
 
 
 
setlocale( LC_ALL, "Japanese_Japan.932" );
len = (int)mbstowcs( NULL, pstr, 0 );
pwstr = (wchar_t *)malloc( sizeof(wchar_t) * (len+1) );
mbstowcs( pwstr, pstr, len+1 );
...
free( pwstr );

ロケール設定を変更しない

  • &ref(): File not found: "WCS2MBS.zip" at page "VisualC++/文字コード変換";

unicode.h

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
	@file	unicode.h
	<ul>
	<li>Unicode関係のお便利関数群 by Pastel 1999/10/22
	<li>setlocale ではなく _create_locale を使用するように修正 by TakeAsh 2013/01/08
	<li>ロケール名を指定できるように修正 by TakeAsh 2013/01/08
	<li>エラー時にエラーコードをセットするように修正 by TakeAsh 2013/01/09
	</ul>
*/
 
#pragma once
 
#include <errno.h>
 
/**
	UnicodeからShift_JIS(CP932)へ変換。
 
	@retval	NULL以外	Shift_JIS文字列を指すポインタ。<br>
						使用後は明示的にdelete[]すること。
	@retval	NULL		変換失敗。<br>
						SetLastError() でエラー内容を返す。
						<table>
						<tr><th>GetLastError()</th><th>エラー内容</th></tr>
						<tr><td>EINVAL</td><td>NULLが入力された。</td></tr>
						<tr><td>ERANGE</td><td>バッファが確保できなかった。</td></tr>
						<tr><td>EILSEQ</td><td>変換できない文字が含まれていた。</td></tr>
						</table>
*/
char *w2m(
    const wchar_t *wcs,                        ///< [in] 変換元の文字列を指すポインタ。
    const char *locale = "Japanese_Japan.932"    ///< [in] 変換に使用するロケール名。
);
 
/**
	Shift_JIS(CP932)からUnicodeへ変換。
 
	@retval	NULL以外	Unicode文字列を指すポインタ。<br>
						使用後は明示的にdelete[]すること。
	@retval	NULL		変換失敗。<br>
						SetLastError() でエラー内容を返す。
						<table>
						<tr><th>GetLastError()</th><th>エラー内容</th></tr>
						<tr><td>EINVAL</td><td>NULLが入力された。</td></tr>
						<tr><td>ERANGE</td><td>バッファが確保できなかった。</td></tr>
						<tr><td>EILSEQ</td><td>変換できない文字が含まれていた。</td></tr>
						</table>
*/
wchar_t *m2w(
    const char *mbs,                            ///< [in] 変換元の文字列を指すポインタ。
    const char *locale = "Japanese_Japan.932"    ///< [in] 変換に使用するロケール名。
);
 
// EOF

unicode.cpp

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
-
|
|
!
|
|
|
-
|
-
|
!
|
|
|
!
 
 
 
 
 
-
|
|
|
|
|
|
|
-
|
|
!
|
|
|
-
|
-
|
!
|
|
|
!
 
 
#include "stdafx.h"
#include <stdlib.h>        // _wcstombs_s_l(), _mbstowcs_s_l()
#include <locale.h>        // _create_locale(), _free_locale()
#include <windows.h>    // SetLastError()
#include "unicode.h"
 
char *w2m(
    const wchar_t *wcs, 
    const char *locale
)
{
    _locale_t locale_obj;
    errno_t    err;
    size_t len;
    char *mbs = NULL;
 
    SetLastError( 0 );
 
    if ( !wcs ){
        SetLastError( EINVAL );
        return NULL;
    }
 
    locale_obj = _create_locale( LC_ALL, locale );
    err = _wcstombs_s_l( &len, NULL, 0, wcs, 0, locale_obj );
    if ( !err && ( mbs = new char[len] ) ){
        _wcstombs_s_l( &len, mbs, len, wcs, _TRUNCATE, locale_obj );
    } else {
        SetLastError( err );    // EINVAL or ERANGE or EILSEQ
    }
    _free_locale( locale_obj );
 
    return mbs;
}
 
wchar_t *m2w(
    const char *mbs,
    const char *locale
)
{
    _locale_t locale_obj;
    errno_t    err;
    size_t len;
    wchar_t *wcs = NULL;
 
    SetLastError( 0 );
 
    if ( !mbs ){
        SetLastError( EINVAL );
        return NULL;
    }
 
    locale_obj = _create_locale( LC_ALL, locale );
    err = _mbstowcs_s_l( &len, NULL, 0, mbs, 0, locale_obj );
    if ( !err && ( wcs = new wchar_t[len] ) ){
        _mbstowcs_s_l( &len, wcs, len, mbs, _TRUNCATE, locale_obj );
    } else {
        SetLastError( err );    // EINVAL or ERANGE or EILSEQ
    }
    _free_locale( locale_obj );
 
    return wcs;
}
 
// EOF

strdump.h

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
	@file	strdump.h
	char*, wchar_t* を16進ダンプする関数
*/
 
#pragma once
 
/**
	16進文字列に変換する。
 
	@return	変換後の文字列を指すポインタ
*/
wchar_t *dumpW(
    const wchar_t *wcs    ///< [in] 変換元文字列
);
 
/**
	16進文字列に変換する。
 
	@return	変換後の文字列を指すポインタ
*/
wchar_t *dumpW(
    const char *mbs    ///< [in] 変換元文字列
);
 
/**
	16進文字列に変換する。
 
	@return	変換後の文字列を指すポインタ
*/
char *dumpA(
    const wchar_t *wcs    ///< [in] 変換元文字列
);
 
/**
	16進文字列に変換する。
 
	@return	変換後の文字列を指すポインタ
*/
char *dumpA(
    const char *mbs    ///< [in] 変換元文字列
);
 
// EOF

strdump.cpp

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
-
|
|
!
|
!
 
 
-
|
-
|
|
!
|
!
 
 
-
|
-
|
|
!
|
!
 
 
-
|
-
|
|
!
|
!
 
 
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include "strdump.h"
 
#define    BUFFERLEN    (1024)
 
wchar_t    messageW[BUFFERLEN];
wchar_t    bufferW[BUFFERLEN];
char    messageA[BUFFERLEN];
char    bufferA[BUFFERLEN];
 
wchar_t *dumpW( const wchar_t *wcs )
{
    wcscpy_s( messageW, L"UTF16LE:" );
    while( *wcs ){
        wsprintf( bufferW, L" %04x", *wcs++ );
        wcscat_s( messageW, bufferW );
    }
    return messageW;
}
 
wchar_t *dumpW( const char *mbs )
{
    wcscpy_s( messageW, L"SJIS:" );
    while( *mbs ){
        wsprintf( bufferW, L" %02x", (*mbs++) & 0x0ff );
        wcscat_s( messageW, bufferW );
    }
    return messageW;
}
 
char *dumpA( const wchar_t *wcs )
{
    strcpy_s( messageA, "UTF16LE:" );
    while( *wcs ){
        sprintf_s( bufferA, " %04x", *wcs++ );
        strcat_s( messageA, bufferA );
    }
    return messageA;
}
 
char *dumpA( const char *mbs )
{
    strcpy_s( messageA, "SJIS:" );
    while( *mbs ){
        sprintf_s( bufferA, " %02x", (*mbs++) & 0x0ff );
        strcat_s( messageA, bufferA );
    }
    return messageA;
}
 
// EOF

WCS2MBS.cpp

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
-
|
|
|
-
|
|
-
-
|
|
|
|
|
|
|
|
|
|
|
|
!
!
!
|
|
!
 
 
// WCS2MBS.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
 
#include "stdafx.h"
#include <locale.h>
#include <string.h>
#include <windows.h>
#include <errno.h>
#include "unicode.h"
#include "strdump.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t *wcs;
    char *mbs;
 
    setlocale( LC_ALL, "Japanese_Japan.932" );
 
    if ( argc > 1 ){
        wcs = argv[1];
        wprintf( L"Source: '%s'\n", wcs );
        wprintf( L"%s\n", dumpW( wcs ) );
        if ( mbs = w2m( wcs ) ){
            wprintf( L"%s\n", dumpW( mbs ) );
            delete[] mbs;
        } else {
            switch( GetLastError() ){
                case EINVAL:
                    wprintf( L"エラー: NULLが入力されました\n" );
                    break;
                case ERANGE:
                    wprintf( L"エラー: バッファが確保できませんでした\n" );
                    break;
                case EILSEQ:
                    wprintf( L"エラー: 変換できない文字が含まれていました\n" );
                    break;
                default:
                    wprintf( L"エラー: 変換失敗\n" );
                    break;
            }
        }
    }
 
    return 0;
}
 
// EOF

WideCharToMultiByte 関数使用版

リファレンス

マルチバイト文字のシーケンスの解釈

Unicode and Character Set Functions

全角・半角変換


リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sat, 11 Mar 2017 03:07:07 JST (259d)