mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【C言語】UTF8 <-> SJIS 変換(VisualStudio2017)

何気に解決するまで時間を要したのでメモっておく
結果的に誰かのブログのまるパクリ(どこだったかは忘れました…)
感謝

#include "stdafx.h"
#include <Windows.h>
#include <string>

std::string UTF8toSjis(std::string srcUTF8)
{
	//Unicodeへ変換後の文字列長を得る
	int lenghtUnicode = MultiByteToWideChar(CP_UTF8, 0, srcUTF8.c_str(), srcUTF8.size() + 1, NULL, 0);

	//必要な分だけUnicode文字列のバッファを確保
	wchar_t* bufUnicode = new wchar_t[lenghtUnicode];

	//UTF8からUnicodeへ変換
	MultiByteToWideChar(CP_UTF8, 0, srcUTF8.c_str(), srcUTF8.size() + 1, bufUnicode, lenghtUnicode);

	//ShiftJISへ変換後の文字列長を得る
	int lengthSJis = WideCharToMultiByte(CP_THREAD_ACP, 0, bufUnicode, -1, NULL, 0, NULL, NULL);

	//必要な分だけShiftJIS文字列のバッファを確保
	char* bufShiftJis = new char[lengthSJis];

	//UnicodeからShiftJISへ変換
	WideCharToMultiByte(CP_THREAD_ACP, 0, bufUnicode, lenghtUnicode + 1, bufShiftJis, lengthSJis, NULL, NULL);

	std::string strSJis(bufShiftJis);

	delete bufUnicode;
	delete bufShiftJis;

	return strSJis;
}

std::string SjistoUTF8(std::string srcSjis)
{
	//Unicodeへ変換後の文字列長を得る
	int lenghtUnicode = MultiByteToWideChar(CP_THREAD_ACP, 0, srcSjis.c_str(), srcSjis.size() + 1, NULL, 0);

	//必要な分だけUnicode文字列のバッファを確保
	wchar_t* bufUnicode = new wchar_t[lenghtUnicode];

	//ShiftJISからUnicodeへ変換
	MultiByteToWideChar(CP_THREAD_ACP, 0, srcSjis.c_str(), srcSjis.size() + 1, bufUnicode, lenghtUnicode);


	//UTF8へ変換後の文字列長を得る
	int lengthUTF8 = WideCharToMultiByte(CP_UTF8, 0, bufUnicode, -1, NULL, 0, NULL, NULL);

	//必要な分だけUTF8文字列のバッファを確保
	char* bufUTF8 = new char[lengthUTF8];

	//UnicodeからUTF8へ変換
	WideCharToMultiByte(CP_UTF8, 0, bufUnicode, lenghtUnicode - 1, bufUTF8, lengthUTF8, NULL, NULL);

	std::string strUTF8(bufUTF8);

	delete bufUnicode;
	delete bufUTF8;

	return strUTF8;
}

【PSC】本体へPNGファイルをコピーするシェル(壁紙変更)

※※※ 取扱注意!!! ※※※

※※※ 使用方法によっては文鎮化の危険性あり ※※※
※※※ 事前に必ずバックアップをとってください ※※※
※※※ 使用にあたっては利用者の自己責任でお願いします ※※※

USBメモリに以下のpngファイルを置いてください
/games/JP_US_BG.png … 1280 x 720
/games/Acid_C_Btn.png … 200 x 68
※元のpngファイルは、USBメモリの /backup/usr/sony/share/data/images/GR の中にあります)


USBメモリのファイルを、PSC本体へコピーするシェルです
※別途 gpghax が必要です

PSC電源オフ、電源ケーブルを抜いていることを確認
USBメモリを挿す
電源ケーブルを挿し、PSC電源オン
起動直後にブラックアウトします
処理が終わると画面が表示されるので電源を切り電源ケーブルを抜いてUSBメモリを抜いてください

lolhack.sh

#!/bin/bash

### define
DB=regional_custom.db
BACKUPDIR=/media/backup
GAMEDIR=/media/games
LOGDIR=/media/log

### get log number
LOGCOUNT=1
LOGCOUNT_MAX=999
while [ $LOGCOUNT -le $LOGCOUNT_MAX ]
do
    LOGCOUNTNAME=$(printf %03d $LOGCOUNT)
    if [ -e $LOGDIR/${LOGCOUNTNAME}_before_ls.txt ]; then
        LOGCOUNT=`expr $LOGCOUNT + 1`
    else
        break
    fi
done
LOGCOUNTNAME=$(printf %03d $LOGCOUNT)

### UI Stop
sleep 8
echo "UI Stop" >> /media/messages.txt 
killall ui_menu
sleep 5

### log(before)
COUNT=1
COUNT_MAX=30
while [ $COUNT -le $COUNT_MAX ]
do
    if [ -e /gaadata/$COUNT ]; then
        echo "/gaadata/$COUNT" >> $LOGDIR/${LOGCOUNTNAME}_before_ls.txt 
        ls -l /gaadata/$COUNT >> $LOGDIR/${LOGCOUNTNAME}_before_ls.txt
    fi
    COUNT=`expr $COUNT + 1`
done
cd /
df -h > $LOGDIR/${LOGCOUNTNAME}_before_df.txt
sync

### ========== install png (USB -> PSC) ========================
mount -o rw,remount /
echo "INSTALL PNG (USB -> PSC)" >> /media/messages.txt
cp /media/games/JP_US_BG.png /usr/sony/share/data/images/GR/
cp /media/games/Acid_C_Btn.png /usr/sony/share/data/images/GR/
sync
### ============================================================

### log(after)
COUNT=1
COUNT_MAX=30
while [ $COUNT -le $COUNT_MAX ]
do
    if [ -e /gaadata/$COUNT ]; then
        echo "/gaadata/$COUNT" >> $LOGDIR/${LOGCOUNTNAME}_after_ls.txt 
        ls -l /gaadata/$COUNT >> $LOGDIR/${LOGCOUNTNAME}_after_ls.txt
    fi
    COUNT=`expr $COUNT + 1`
done
cd /
find . | sort > $LOGDIR/${LOGCOUNTNAME}_after_find.txt
df -h > $LOGDIR/${LOGCOUNTNAME}_after_df.txt
sync

#UI Start
echo "UI Start" >> /media/messages.txt 
cd /data/AppData/sony/pcsx
/usr/sony/bin/ui_menu --power-off-enable
echo "cp /data/sony/ui/error.log" >> /media/messages.txt 
cp -pr /data/sony/ui/error.log /media/error.log
sync