【VBScript】数値を漢数字に変換する

数値を漢数字に変換するプログラム

Function KanSuuK(num)
    Kingaku=0 '0=漢数字 1=金額漢数字
    If Kingaku=0 Then
        saKeta=Array("","万","億","兆","京","垓","𥝱","穣","溝","澗","正","載","極","恒河沙","阿僧祇","那由他","不可思議","無量大数")
    Else
        saKeta=Array("","萬","億","兆","京","垓","𥝱","穣","溝","澗","正","載","極","恒河沙","阿僧祇","那由他","不可思議","無量大数")
    End If
    If IsNumeric(num) Then sNum=CStr(num)
    j=CInt(Len(sNum) Mod 4)
    If j>0 Then sW=KanSuuKK(Mid(sNum,1,j)) & saKeta(CInt(Fix(Len(sNum)/4)))
    For i=0 To CInt(Fix(Len(sNum)/4))
        iSuu=Mid(sNum,j+1+i*4,4)
        k=CInt(Fix(Len(sNum)/4))-i-1
        If K<0 Then k=0
        sW=sW & KanSuuKK(iSuu) & saKeta(k)
    Next
    KanSuuK=sW
End Function

Function KanSuuKK(num)
    Kingaku=0   '0=漢数字 1=金額漢数字(大字)
    Sangi=0     '0=通常 1=20=廿/30=卅/40=卌
    If Kingaku=0 Then
        saNum=Array("","一","二","三","四","五","六","七","八","九") '〇/零は対象外
        saKeta=Array("","","十","百","千")
    Else
        saNum=Array("","壱","弐","参","四","伍","六","七","八","九")
        saKeta=Array("","","拾","百","阡")
    End If
    If IsNumeric(num) Then sNum=CStr(num)
    If sNum="0" Then
        If Kingaku=0 Then
            KanSuuKK="〇"
            Exit Function
        Else
            KanSuuKK="零"
            Exit Function
        End If
    End If
    For i=Len(sNum) To 1 Step -1
        sW=saNum(CInt(Mid(sNum,Len(sNum)-i+1,1)))
        sSk=""
        If sW<>"" Then sSK=saKeta(i)
        If sW=saNum(2) And sSK=saKeta(2) And Sangi=1 Then
            sSW=sSW & "廿" '卄
        ElseIf sW=saNum(3) And sSk=saKeta(2) And Sangi=1 Then
            sSW=sSW & "卅" '丗
        '↓ANSI(Shift-Jis)不可
        'ElseIf sW=saNum(4) And sSk=saKeta(2) And Sangi=1 Then
        '    sSW=sSW & "卌"
        Else
            If Kingaku=0 And sW=saNum(1) Then
                sSW=sSW & sSK
                If i=1 Then sSW=sSW & sW
            Else
                If saNum(1)<>sW Then
                    If saketa(i)<>"" Then
                        sSW=sSW & sW & sSK
                    Else
                        sSW=sSW & sW
                    End If
                Else
                    sSW=sSW & sW & sSk
                End If
            End If
        End If
    Next
    KanSuuKK=sSW
End Function

WScript.Echo KanSuuK("123456789")

【C++】ガンダムネットワーク大戦 エリア確認アプリケーション

ガンダムネットワーク大戦で使えるエリア確認アプリケーションを作りました
苦労した点はウィンドウを六角形に変形させたことと半透明にすることでした
このアプリケーションは前にC#/VB.netで作ってましたがフレームワークを別途インストールしないといけないという欠点がありました
このプログラムではEXEファイル単体で動きます

■注目関数
○最前面に固定
CreateWindowEx WS_EX_TOPMOSTパラメーター
○六角形にウィンドウを加工
CreatePolygonRgn
SetWindowRgn
○ウィンドウを半透明にする
CreateWindowEx WS_EX_LAYEREDパラメーター
SetLayeredWindowAttributes
○左ドラッグでウィンドウを移動
PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, lParam);

#include <windows.h>
#include "resource.h"
#include <objidl.h>
#include <gdiplus.h>
#include <cmath>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")

//六角形と中心線の描画とウィンドウを六角形にする
VOID OnPaint(HWND hwnd, HDC hdc,int height, int width)
{
	//ウィンドウを六角形にする
	static POINT pt[7];
	HRGN hrgn;
	pt[0].x = width / 2 + height / 2 * -std::cos(45);
	pt[0].y = 0;
	pt[1].x = width / 2 + width / 2 * std::cos(45);
	pt[1].y = 0;
	pt[2].x = width;
	pt[2].y = height / 2;
	pt[3].x = width / 2 + width / 2 * std::cos(45);
	pt[3].y = height;
	pt[4].x = width / 2 + width / 2 * -std::cos(45);
	pt[4].y = height;
	pt[5].x = 0;
	pt[5].y = height / 2;
	pt[6].x = width / 2 + width / 2 * -std::cos(45);
	pt[6].y = 0;
	hrgn = CreatePolygonRgn(pt, 7, ALTERNATE);
	SetWindowRgn(hwnd, hrgn, TRUE);

	//枠線(六角形)と中心線の描画
	Graphics graphics(hdc);
	Pen      pen(Color(255, 125, 125, 125), 1);//Gray
	//'縦線
	graphics.DrawLine(&pen, (int)(width / 2), 0, (int)(width / 2), (int)(height));
	//'横線
	graphics.DrawLine(&pen, 0, (int)(height / 2), (int)(width), (int)(height / 2));
	//'右斜線
	graphics.DrawLine(&pen, (int)(width / 2), (int)(height / 2), (int)(width / 2 + width / 2 * -std::cos(45)), 0);
	graphics.DrawLine(&pen, (int)(width / 2), (int)(height / 2), (int)(width / 2 + width / 2 * std::cos(45)), (int)(height));
	//'左斜線
	graphics.DrawLine(&pen, (int)(width / 2), (int)(height / 2), (int)(width / 2 + width / 2 * std::cos(45)), 0);
	graphics.DrawLine(&pen, (int)(width / 2), (int)(height / 2), (int)(width / 2 + width / 2 * -std::cos(45)), (int)(height));
	//'左上線
	graphics.DrawLine(&pen, (int)(width / 2 + width / 2 * -std::cos(45)), 0, 0, (int)(height / 2));
	//'左下線
	graphics.DrawLine(&pen, 0, (int)(height / 2), (int)(width / 2 + width / 2 * -std::cos(45)), (int)(height));
	//'右上線
	graphics.DrawLine(&pen, (int)(width / 2 + width / 2 * std::cos(45)), 0, (int)(width), (int)(height / 2));
	//'右下線
	graphics.DrawLine(&pen, (int)(width / 2 + width / 2 * std::cos(45)), height, (int)(width), (int)(height / 2));
	//'上線
	graphics.DrawLine(&pen, (int)(width / 2 + width / 2 * std::cos(45)), 0, (int)(width / 2 + width / 2 * -std::cos(45)), 0);
	//'下線
	graphics.DrawLine(&pen, (int)(width / 2 + width / 2 * std::cos(45)), (int)(height-1), (int)(width / 2 + width / 2 * -std::cos(45)), (int)(height)-1);

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
	WPARAM wParam, LPARAM lParam) {
	
	static int sw = 0;
	POINT pt;
	HMENU hmenu, hSubmenu;
	HDC hdc;
	PAINTSTRUCT ps;
	static int width = 0, height = 0;
	static int iXpos = 0, iYpos = 0;
	RECT rect;
	
	switch (message) {
	case WM_MOVE:
		iXpos = LOWORD(lParam);
		iYpos = HIWORD(lParam);
	case WM_SIZE:
		width = LOWORD(lParam);
		height = HIWORD(lParam);
		break;
	case WM_CREATE:
		SetLayeredWindowAttributes(hwnd, RGB(255, 255, 255), 120, LWA_ALPHA);
		InvalidateRect(hwnd, NULL, TRUE);
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDCLOSE: //終了
			DestroyWindow(hwnd);
			break;
		case ID_R_90: //90%
			InvalidateRect(hwnd, NULL, TRUE);
			MoveWindow(hwnd, iXpos, iYpos, 778, 440, TRUE);
			break;
		case ID_R_100: //100%
			InvalidateRect(hwnd, NULL, TRUE);
			MoveWindow(hwnd, iXpos, iYpos, 867, 480, TRUE);
			break;
		case ID_R_110: //110%
			InvalidateRect(hwnd, NULL, TRUE);
			MoveWindow(hwnd, iXpos, iYpos, 955, 525, TRUE);
			break;
		case ID_R_125: //125%
			InvalidateRect(hwnd, NULL, TRUE);
			MoveWindow(hwnd, iXpos, iYpos, 1084, 600, TRUE);
			break;
		case ID_R_150: //150%
			InvalidateRect(hwnd, NULL, TRUE);
			MoveWindow(hwnd, iXpos, iYpos, 1300, 720, TRUE);
			break;
		default:
			return (DefWindowProc(hwnd, message, wParam, lParam));
		}
		break;
	case WM_RBUTTONDOWN:
		//右クリックでサブメニューを表示
		pt.x = LOWORD(lParam);
		pt.y = HIWORD(lParam);
		hmenu = LoadMenu((HINSTANCE)GetWindowLong(hwnd,-6 /*GWL_HINSTANCE*/), MAKEINTRESOURCE(IDR_MENU1));
		hSubmenu = GetSubMenu(hmenu, 0);
		ClientToScreen(hwnd, &pt);
		TrackPopupMenu(hSubmenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hwnd, NULL);
		DestroyMenu(hmenu);
		break;
	case WM_LBUTTONDOWN:
		//左ドラッグでウィンドウを移動
		PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, lParam);
		break;
	case WM_PAINT:
		GetClientRect(hwnd, &rect);
		hdc = BeginPaint(hwnd, &ps);
		OnPaint(hwnd, hdc, rect.bottom, rect.right); //六角形と中心線の描画
		EndPaint(hwnd, &ps);
		break;
	case WM_CLOSE:
		DestroyWindow(hwnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow
) {
	HWND hWnd;
	LPCTSTR szclassName = TEXT("GNT_Area_Cpp");
	WNDCLASSEX wcex;

	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR           gdiplusToken;
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

	ZeroMemory((LPVOID)&wcex, sizeof(WNDCLASSEX));

	//ウィンドウクラスを登録
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = 0;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wcex.lpszMenuName = TEXT("IDR_MENU1");
	wcex.lpszClassName = szclassName;
	wcex.hIconSm = NULL;
	RegisterClassEx(&wcex);

	//ウィンドウ作成
	hWnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED, szclassName, 0, (WS_BORDER),
		CW_USEDEFAULT, CW_USEDEFAULT,
		867, 480,/*100%*/
		NULL, NULL, hInstance, NULL);
	SetWindowLong(hWnd, GWL_STYLE, 0);

	//ウィンドウ表示
	ShowWindow(hWnd, SW_SHOW);

	//メッセージループ
	MSG msg = {};
	while (GetMessage(&msg, NULL, 0, 0) == 1) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	GdiplusShutdown(gdiplusToken);
	return msg.wParam;
}

【VSCode/C++】「名前空間に"std"メンバー"cout"がありません」のインテリセンスエラー

VSCode】「名前空間に"std"メンバー"cout"がありません」のインテリセンスエラー

VSCode】「名前空間に"std"メンバー"cout"がありません」のインテリセンスエラー

このエラーは「C/C++ Configurations (c_cpp_properties.json)」の設定エラーで発生する

コンパイラパス(compilerPath)」が「C:/MinGW/bin/g++.exe」の時にこのエラーが発生した
このエラーを解消するためには「C 標準(cStandard)」を「c11」と「C++ 標準(cppStandard)」を「c++11」などに一度設定すると直る

なお、初期設定では「C 標準(cStandard)」を「c17」と「C++ 標準(cppStandard)」を「c++17」となっている

C/C++ Configurations」設定はソースペインを右クリックから「コマンドパレット」→「C/C++:構成の編集(UI)」を開き下の方にある「C 標準(cStandard)」を「c11」と「C++ 標準(cppStandard)」を「c++11」にする

【C++】宝さがしゲーム【C++11】


#include <iostream>
#include <random>
#include <algorithm>
#include <vector>
#include <numeric>
#include <iterator>
#include <chrono>
#include <string>
enum digstate{
    stilldig,       // 0
    stilltreasure,  // 1
    dig,            // 2
    digtreasure     // 3
};
void dispgrid(std::vector<int>&grid, const std::vector<std::string>&rows){
    for(int i=0;i<100;i++){
        if(i%10==0){
            std::cout<<std::endl;
            if(i==0) std::cout<<" 0123456789"<<std::endl;
            std::cout<<rows[i/10];
        }
        switch(grid[i]){
            case digstate::stilldig:
                std::cout<<"-";break;
            case digstate::stilltreasure:
                std::cout<<"-";break;
            case digstate::dig:
                std::cout<<"〇";break;
            case digstate::digtreasure:
                std::cout<<"宝";break;
        }
    }
    std::cout<<std::endl;
}
int main(){
    std::vector<int> grid(100);     //表示グリッド
    std::vector<int> digtable(100); //掘る順番
    auto seed=std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::mt19937 mt(seed);
    int treasureNumber; //宝の数
    int playstyle;      //手動か自動か
    std::fill(grid.begin(),grid.end(),0);           //gridは全てゼロ埋め
    std::iota(digtable.begin(),digtable.end(),0);   //digtableは0から99まで連番
    //宝の数を入力
    std::cout<<"宝箱の数[1-100]"<<std::endl;
    std::cin>>treasureNumber;
    if(treasureNumber<1||100<treasureNumber){
        std::cout<<"異常値が入力されました"<<std::endl;
        return EXIT_FAILURE;
    }
    // 宝の位置設定(シャッフル)
    std::shuffle(std::begin(digtable),std::end(digtable),mt);
    for(int i=0;i<treasureNumber;i++){
        grid[digtable[i]]=digstate::stilltreasure;
    }
    std::vector<int>::iterator it=digtable.begin();   //iterator
    int treasureCont=0;
    const std::vector<std::string> rows={"0","1","2","3","4","5","6","7","8","9"};
    //プレイスタイル入力
    std::cout<<"1:Auto 2:Play"<<std::endl;
    std::cin>>playstyle;
    if(playstyle==1){
        // 自動回答なので再抽選(宝箱抽選を使いまわしているので注意)
        std::shuffle(std::begin(digtable),std::end(digtable),mt);
    }else if(playstyle==2){
    }else{
        std::cout<<"異常値が入力されました"<<std::endl;
        return EXIT_FAILURE;
    }
    //グリッド表示
    dispgrid(grid,rows);
    for(;;){
        std::cout<<std::endl;
        int col,row;
        if(playstyle==1){
            //playstayle==auto
            col=*it%10;
            row=*it/10;
            ++it;
        }else{
            //playstayle==play
            std::cout<<"Input:RowNumber ColNumber"<<std::endl;
            std::cin>>row>>col;
        }
        //当たり外れ判定
        if(grid[row*10+col]==digstate::dig || grid[row*10+col]==digstate::digtreasure){
            std::cout<<"already open\n";
        }else if(grid[row*10+col]==digstate::stilldig){
            grid[row*10+col]=digstate::dig;
        }else if(grid[row*10+col]==digstate::stilltreasure){
            grid[row*10+col]=digstate::digtreasure;
            treasureCont++;
            std::cout<<"found a treasure!\n";
        }
        //グリッド表示
        dispgrid(grid,rows);
        //結果表示
        if(treasureCont==treasureNumber){
            std::cout<<std::endl<<"all treasure discovery.congratulations!";
            return EXIT_SUCCESS;  //ゲームオーバー(終了)
        }
    }
}

【Python】オセロ(Othero)[リバーシ(riversi)]を作ってみた

リクエストがあったのでオセロを作ってみました
作成所要時間は座標系の嫌なバグが出たので15時間ほどかかりました
参考になれば幸いです


#プレイヤー値 順番により入れ替わる
player=1
notplayer=2

#ボードサイズ
bsize=8

#盤面
board=[[0 for i in range(bsize)] for j in range(bsize)]
#初期配置
board[3][4]=1#黒
board[4][3]=1
board[3][3]=2#白
board[4][4]=2

#入力チェック
def check(x,y):
    try:
        val=board[y][x]
    except:#範囲外
        return False
    if val==0:#無接続
        return False
    return True

#全て駒で埋まったかチェック
def full():
    cnt=0
    for i in range(bsize):
        for j in range(bsize):
            if board[i][j]>0:
                cnt+=1
    if cnt==bsize*bsize:
        return True
    else:
        return False

#盤面表示
def pboard():
    print(" 01234567")
    for i in range(bsize):
        print(su[i],end='')
        for j in range(bsize):
            print(dic[board[i][j]],end='')
        print('\n',end='')

#裏返す
def reversi(x,y):#PieceReturn
    #既に置かれた所はダメ
    if board[y][x]==player:
        return False
    if board[y][x]==notplayer:
        return False
    #CanInputEraser(入力可能表示を消す)
    board[y][x]=player
    for i in range(bsize):
        for j in range(bsize):
            if board[i][j]<0:
                board[i][j]=0

    result=[]
    for dy,dx in [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]:
        depth,flg = 1,0
        tmp = []
        for _ in range(bsize):
            # 検索対象の座標を設定する
            ry,rx = y + (dy * depth) , x + (dx * depth) 
            # ボードの範囲を超えていたら抜ける
            if any([rx<0,ry<0,rx>=bsize,ry>=bsize]):
                break
            # 返せる駒がなくて0だったら抜ける
            if board[ry][rx]==0:
                break
            # 返せる駒がなくてplayerと同じ駒だったら抜ける
            elif flg==0 and board[ry][rx]==player:
                break
            # 返せる駒が初めて見つかったらflg=1にする
            elif flg==0 and board[ry][rx]==notplayer:
                flg = 1
                # 返せる座標を追加する
                tmp.append((ry,rx))
            # 返せる駒が初めて見つかったら返せる座標を追加する
            elif flg==1 and board[ry][rx]==notplayer:
                tmp.append((ry,rx))
            # flg=1の状態でplayerと同じ駒が見つかったらresultに追加する
            elif flg==1 and board[ry][rx]==player:
                result += tmp
                break
            depth += 1
        
    # 石をひっくり返す
    for y2,x2 in result:
        board[y2][x2]=player
    return True

#入力可能位置の検索
def CanInput():
    for x in range(bsize):
        for y in range(bsize):
            if board[y][x]<0:
                board[y][x]=0
    bingo=False
    for x in range(bsize):
        for y in range(bsize):
            if board[y][x]==player:
                for dy,dx in [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]:
                    depth,flg = 1,0
                    for _ in range(bsize):
                        # 検索対象の座標を設定する
                        ry,rx = y + (dy * depth) , x + (dx * depth) 
                        # ボードの範囲を超えていたら抜ける
                        if any([rx<0,ry<0,rx>=bsize,ry>=bsize]):
                            break
                        # 返せる駒がなくてplayerと同じ駒だったら抜ける
                        if flg==0 and board[ry][rx]==player:
                            break
                        # 返せる駒が初めて見つかったらflg=1にする
                        elif flg==0 and board[ry][rx]==notplayer:
                            flg = 1
                        # flg=1の状態でplayerと同じ駒が見つかったら処理を抜ける
                        elif flg==1 and board[ry][rx]==player:
                            break
                        # flg=1の状態で駒を置ける場合はマークする
                        elif flg==1 and board[ry][rx]<=0:
                            board[ry][rx]=-player
                            bingo=True
                            break
                        if board[ry][ry]<=0:
                            break
                        depth += 1
    return bingo

#結果表示 勝敗と駒の数
def DispResult():
    black=0
    white=0
    for i in range(bsize):
        for j in range(bsize):
            if board[i][j]==1:
                black+=1
            elif board[i][j]==2:
                white+=1
    if black>white:
        print(f"Black Win! Black={black} White={white}")
    elif white>black:
        print(f"White Win! White={white} Black={black}")
    elif white==black:
        print("Drow!")

#ここからメイン===================================================

#表示用
dispplayer={1:"○",2:"●"}
dic={0:' ',1:'○',2:'●',-1:'□',-2:'■'}
su={0:'0',1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7',}
passcount=0

while(True):
    CanInput()  #入力可能位置の検索
    pboard()    #盤面表示
    #座標入力
    try:
        print(f"player={dispplayer[player]}")
        x=int(input("col="))
        y=int(input("row="))
    except:
        #入力不正時はゲーム終了
        break
    #駒をひっくり返す
    if check(x,y)==True:
        if full()==False:
            #ここで駒を返す処理
            if reversi(x,y)==False:
                print("NG") #まず無いハズ(既に駒があるところを指定)
                print("")
            else:
                passcount=0
                #プレイヤー交代
                player,notplayer=notplayer,player
        else:
            #全て駒で埋まった
            #結果表示
            pboard()
            DispResult()
            break   #ゲーム終了
    else:
        print("NG")
        print("")

    #駒が置ける位置の検索表示
    if CanInput()==False:
        passcount+=1
        #駒を置けない
        pboard()
        #すべて駒で埋まったか
        if full()==False or passcount<2:
            #駒が置けないのでパス
            print(f"player={dispplayer[player]} Pass!")
            print("")
            #プレイヤー交代
            player,notplayer=notplayer,player
            #黒白共に駒が置けない場合は終了
            if CanInput()==False:
                pboard()
                DispResult()
                break
        else:
            #全て駒で埋まった又は両プレイヤー共に駒が置けない
            #結果表示
            pboard()
            DispResult()
            break   #ゲーム終了

【Windows】端末(ターミナル)の種類と起動方法

現在Windows[10,11]で使える端末(terminal)は5種類あります
その簡単な説明と起動方法を紹介します

ターミナルの種類

コマンドプロンプト(Command Prompt)

起動方法

■スタートメニュー
スタートメニュー→Windows システムツール→コマンドプロンプト
■ファイル名を指定して実行
cmdまたはcmd.exe

コードページ(抜粋)

規定 id .NET Name 追加情報
932 shift_jis ANSI/OEM Japanese; Japanese (Shift-JIS)
20127 us-ascii US-ASCII (7-bit)
51932 euc-jp EUC Japanese
65001 utf-8 Unicode (UTF-8)

docs.microsoft.com

パワーシェル(Windows PowerShell)

起動方法

■スタートメニュー
スタートメニュー→Windows PowerShellWindows PowerShell
■ファイル名を指定して実行
powershellまたはpowershell.exe

パワーシェルISE(Windows PowerShell ISE)

起動方法

■スタートメニュー
スタートメニュー→Windows PowerShellWindows PowerShell ISE
■ファイル名を指定して実行
powershell_ISEまたはpowershell_ISE.exe

パワーシェル7(PowerShell 7)

インストール

docs.microsoft.com

起動方法

■スタートメニュー
スタートメニュー→PowerShellPowerShell 7
■ファイル名を指定して実行
pwshまたはpwsh.exe

ウィンドウズターミナル(Windows Terminal)

インストール

docs.microsoft.com

起動方法

■スタートメニュー
スタートメニュー→ターミナル
■ファイル名を指定して実行
wtまたはwt.exe

【PowerShell】ソースコードファイル種による文字化けと文字コード

成否の評価について
- はリテラル文字または変数・関数名に2バイト文字が含まれている時点で構文エラーになる
× はターミナル出力時に文字化けする


Write-Output(ehco,write)

ターミナル ソースコードファイル 成否
PowerShell Shift-Jis
PowerShell UTF-8 -
PowerShell UTF-8BOM
pwsh Shift-Jis ×
pwsh UTF-8
pwsh UTF-8BOM


変数(文字列)から出力

ターミナル ソースコードファイル 成否
PowerShell Shift-Jis
PowerShell UTF-8 -
PowerShell UTF-8BOM
pwsh Shift-Jis ×
pwsh UTF-8
pwsh UTF-8BOM


データファイルの文字化け

Get-Content(gc)

ターミナル ソースコードファイル データファイル 成否
PowerShell Shift-Jis Shift-JIs
PowerShell Shift-Jis UTF-8 ×
PowerShell Shift-Jis UTF-8BOM
PowerShell UTF-8 Shift-JIs -
PowerShell UTF-8 UTF-8 -
PowerShell UTF-8 UTF-8BOM -
PowerShell UTF-8BOM Shift-JIs
PowerShell UTF-8BOM UTF-8 ×
PowerShell UTF-8BOM UTF-8BOM
pwsh Shift-Jis Shift-Jis ×
pwsh Shift-Jis UTF-8
pwsh Shift-Jis UTF-8BOM
pwsh UTF-8 Shift-Jis ×
pwsh UTF-8 UTF-8
pwsh UTF-8 UTF-8BOM
pwsh UTF-8BOM Shift-Jis ×
pwsh UTF-8BOM UTF-8
pwsh UTF-8BOM UTF-8BOM


OutputEncoding.EncodingName

デフォルトの出力時のエンコード

ターミナル ソースコードファイル Encode
PowerShell Shift-Jis US-ASCII
PowerShell UTF-8 US-ASCII
PowerShell UTF-8BOM US-ASCII
pwsh Shift-Jis UTF-8
pwsh UTF-8 UTF-8
pwsh UTF-8BOM UTF-8


[console]::OutputEncoding

デフォルトのコンソール出力時のエンコード

ターミナル ソースコードファイル Encode
PowerShell Shift-Jis 日本語 (シフト JIS)
PowerShell UTF-8 日本語 (シフト JIS)
PowerShell UTF-8BOM 日本語 (シフト JIS)
pwsh Shift-Jis Japanese (Shift-JIS)
pwsh UTF-8 Japanese (Shift-JIS)
pwsh UTF-8BOM Japanese (Shift-JIS)


リダイレクト[>,>>]

リダイレクトでファイル出力時の出力文字エンコード

ターミナル ソースコードファイル Encode
PowerShell Shift-Jis UTF-16LE
PowerShell UTF-8 -
PowerShell UTF-8BOM UTF-16LE
pwsh Shift-Jis ×
pwsh UTF-8 UTF-8
pwsh UTF-8BOM UTF-8



Encodingパラメーターがあるコマンドレット

ソースモジュール コマンドレット
Microsoft.PowerShell.Management Add-Content
Microsoft.PowerShell.Management Get-Content
Microsoft.PowerShell.Management Set-Content
Microsoft.PowerShell.Utility Export-Clixml
Microsoft.PowerShell.Utility Export-Csv
Microsoft.PowerShell.Utility Export-PSSession
Microsoft.PowerShell.Utility Format-Hex
Microsoft.PowerShell.Utility Import-Csv
Microsoft.PowerShell.Utility Out-File
Microsoft.PowerShell.Utility Select-String
Microsoft.PowerShell.Utility Send-MailMessage


Encoding パラメーター

上記コマンドレットのEncodingパラメータに指定できる値です
UTF-8についてはPowerShellとpwshでは意味が異なります
PwoerShellではBOM付きUTF-8ですがpwshではBOM無しUTF-8であることに注意してください


Version パラメーター 説明
PowerShell Ascii Uses Ascii (7-bit) character set.
PowerShell BigEndianUnicode Uses UTF-16 with the big-endian byte order.
PowerShell BigEndianUTF32 Uses UTF-32 with the big-endian byte order.
PowerShell Byte Encodes a set of characters into a sequence of bytes.
PowerShell Default Uses the encoding that corresponds to the system's active code page (usually ANSI).
PowerShell Oem Uses the encoding that corresponds to the system's current OEM code page.
PowerShell String Same as Unicode.
PowerShell Unicode Uses UTF-16 with the little-endian byte order.
PowerShell Unknown Same as Unicode.
PowerShell UTF32 Uses UTF-32 with the little-endian byte order.
PowerShell UTF7 Uses UTF-7.
PowerShell UTF8 Uses UTF-8 (with BOM).
pwsh ascii Uses the encoding for the ASCII (7-bit) character set.
pwsh bigendianunicode Encodes in UTF-16 format using the big-endian byte order.
pwsh oem Uses the default encoding for MS-DOS and console programs.
pwsh unicode Encodes in UTF-16 format using the little-endian byte order.
pwsh utf7 Encodes in UTF-7 format.
pwsh utf8 Encodes in UTF-8 format (no BOM).
pwsh utf8BOM Encodes in UTF-8 format with Byte Order Mark (BOM)
pwsh utf8NoBOM Encodes in UTF-8 format without Byte Order Mark (BOM)
pwsh utf32 Encodes in UTF-32 format.


上記パラメーターの他にPowerShell6.2より.NET Coreまたは.NET Frameworkで規定されているコードページIDまたはコードページ名が使用できます


.NET Coreで規定されているもの

コードページID コードページ名 表示名
1200 utf-16 Unicode
1201 utf-16BE Unicode (Big-Endian)
12000 utf-32 Unicode (UTF-32)
12001 utf-32BE Unicode (UTF-32 Big-Endian)
20127 us-ascii US-ASCII
28591 iso-8859-1 Western European (ISO)
65000 utf-7 Unicode (UTF-7)
65001 utf-8 Unicode (UTF-8)


.NET Frameworkで規定されているもの

コードページID コードページ名 表示名
37 IBM037 IBM EBCDIC (US-Canada)
437 IBM437 OEM United States
500 IBM500 IBM EBCDIC (International)
708 ASMO-708 Arabic (ASMO 708)
720 DOS-720 Arabic (DOS)
737 ibm737 Greek (DOS)
775 ibm775 Baltic (DOS)
850 ibm850 Western European (DOS)
852 ibm852 Central European (DOS)
855 IBM855 OEM Cyrillic
857 ibm857 Turkish (DOS)
858 IBM00858 OEM Multilingual Latin I
860 IBM860 Portuguese (DOS)
861 ibm861 Icelandic (DOS)
862 DOS-862 Hebrew (DOS)
863 IBM863 French Canadian (DOS)
864 IBM864 Arabic (864)
865 IBM865 Nordic (DOS)
866 cp866 Cyrillic (DOS)
869 ibm869 Greek, Modern (DOS)
870 IBM870 IBM EBCDIC (Multilingual Latin-2)
874 windows-874 Thai (Windows)
875 cp875 IBM EBCDIC (Greek Modern)
932 shift_jis Japanese (Shift-JIS)
936 gb2312 Chinese Simplified (GB2312)
949 ks_c_5601-1987 Korean
950 big5 Chinese Traditional (Big5)
1026 IBM1026 IBM EBCDIC (Turkish Latin-5)
1047 IBM01047 IBM Latin-1
1140 IBM01140 IBM EBCDIC (US-Canada-Euro)
1141 IBM01141 IBM EBCDIC (Germany-Euro)
1142 IBM01142 IBM EBCDIC (Denmark-Norway-Euro)
1143 IBM01143 IBM EBCDIC (Finland-Sweden-Euro)
1144 IBM01144 IBM EBCDIC (Italy-Euro)
1145 IBM01145 IBM EBCDIC (Spain-Euro)
1146 IBM01146 IBM EBCDIC (UK-Euro)
1147 IBM01147 IBM EBCDIC (France-Euro)
1148 IBM01148 IBM EBCDIC (International-Euro)
1149 IBM01149 IBM EBCDIC (Icelandic-Euro)
1200 utf-16 Unicode
1201 utf-16BE Unicode (Big-Endian)
1250 windows-1250 Central European (Windows)
1251 windows-1251 Cyrillic (Windows)
1252 Windows-1252 Western European (Windows)
1253 windows-1253 Greek (Windows)
1254 windows-1254 Turkish (Windows)
1255 windows-1255 Hebrew (Windows)
1256 windows-1256 Arabic (Windows)
1257 windows-1257 Baltic (Windows)
1258 windows-1258 Vietnamese (Windows)
1361 Johab Korean (Johab)
10000 macintosh Western European (Mac)
10001 x-mac-japanese Japanese (Mac)
10002 x-mac-chinesetrad Chinese Traditional (Mac)
10003 x-mac-korean Korean (Mac)
10004 x-mac-arabic Arabic (Mac)
10005 x-mac-hebrew Hebrew (Mac)
10006 x-mac-greek Greek (Mac)
10007 x-mac-cyrillic Cyrillic (Mac)
10008 x-mac-chinesesimp Chinese Simplified (Mac)
10010 x-mac-romanian Romanian (Mac)
10017 x-mac-ukrainian Ukrainian (Mac)
10021 x-mac-thai Thai (Mac)
10029 x-mac-ce Central European (Mac)
10079 x-mac-icelandic Icelandic (Mac)
10081 x-mac-turkish Turkish (Mac)
10082 x-mac-croatian Croatian (Mac)
12000 utf-32 Unicode (UTF-32)
12001 utf-32BE Unicode (UTF-32 Big-Endian)
20000 x-Chinese-CNS Chinese Traditional (CNS)
20001 x-cp20001 TCA Taiwan
20002 x-Chinese-Eten Chinese Traditional (Eten)
20003 x-cp20003 IBM5550 Taiwan
20004 x-cp20004 TeleText Taiwan
20005 x-cp20005 Wang Taiwan
20105 x-IA5 Western European (IA5)
20106 x-IA5-German German (IA5)
20107 x-IA5-Swedish Swedish (IA5)
20108 x-IA5-Norwegian Norwegian (IA5)
20127 us-ascii US-ASCII
20261 x-cp20261 T.61
20269 x-cp20269 ISO-6937
20273 IBM273 IBM EBCDIC (Germany)
20277 IBM277 IBM EBCDIC (Denmark-Norway)
20278 IBM278 IBM EBCDIC (Finland-Sweden)
20280 IBM280 IBM EBCDIC (Italy)
20284 IBM284 IBM EBCDIC (Spain)
20285 IBM285 IBM EBCDIC (UK)
20290 IBM290 IBM EBCDIC (Japanese katakana)
20297 IBM297 IBM EBCDIC (France)
20420 IBM420 IBM EBCDIC (Arabic)
20423 IBM423 IBM EBCDIC (Greek)
20424 IBM424 IBM EBCDIC (Hebrew)
20833 x-EBCDIC-KoreanExtended IBM EBCDIC (Korean Extended)
20838 IBM-Thai IBM EBCDIC (Thai)
20866 koi8-r Cyrillic (KOI8-R)
20871 IBM871 IBM EBCDIC (Icelandic)
20880 IBM880 IBM EBCDIC (Cyrillic Russian)
20905 IBM905 IBM EBCDIC (Turkish)
20924 IBM00924 IBM Latin-1
20932 EUC-JP Japanese (JIS 0208-1990 and 0212-1990)
20936 x-cp20936 Chinese Simplified (GB2312-80)
20949 x-cp20949 Korean Wansung
21025 cp1025 IBM EBCDIC (Cyrillic Serbian-Bulgarian)
21866 koi8-u Cyrillic (KOI8-U)
28591 iso-8859-1 Western European (ISO)
28592 iso-8859-2 Central European (ISO)
28593 iso-8859-3 Latin 3 (ISO)
28594 iso-8859-4 Baltic (ISO)
28595 iso-8859-5 Cyrillic (ISO)
28596 iso-8859-6 Arabic (ISO)
28597 iso-8859-7 Greek (ISO)
28598 iso-8859-8 Hebrew (ISO-Visual)
28599 iso-8859-9 Turkish (ISO)
28603 iso-8859-13 Estonian (ISO)
28605 iso-8859-15 Latin 9 (ISO)
29001 x-Europa Europa
38598 iso-8859-8-i Hebrew (ISO-Logical)
50220 iso-2022-jp Japanese (JIS)
50221 csISO2022JP Japanese (JIS-Allow 1 byte Kana)
50222 iso-2022-jp Japanese (JIS-Allow 1 byte Kana - SO/SI)
50225 iso-2022-kr Korean (ISO)
50227 x-cp50227 Chinese Simplified (ISO-2022)
51932 euc-jp Japanese (EUC)
51936 EUC-CN Chinese Simplified (EUC)
51949 euc-kr Korean (EUC)
52936 hz-gb-2312 Chinese Simplified (HZ)
54936 GB18030 Chinese Simplified (GB18030)
57002 x-iscii-de ISCII Devanagari
57003 x-iscii-be ISCII Bengali
57004 x-iscii-ta ISCII Tamil
57005 x-iscii-te ISCII Telugu
57006 x-iscii-as ISCII Assamese
57007 x-iscii-or ISCII Oriya
57008 x-iscii-ka ISCII Kannada
57009 x-iscii-ma ISCII Malayalam
57010 x-iscii-gu ISCII Gujarati
57011 x-iscii-pa ISCII Punjabi
65000 utf-7 Unicode (UTF-7)
65001 utf-8 Unicode (UTF-8)