読者です 読者をやめる 読者になる 読者になる

kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

Shift-JIS

Boost.Tokenizer Function Conceptの練習用にShift-JIS文字の切り出しをしたときのついでに、作ったやつ。

簡単にShift-JIS文字列を1文字毎に分割する

日本語文字コードを見て作った。
※正しいShift-JIS文字列が入力されているかはチェックしてないので注意

#include <iostream>
#include <string>
#include <boost/foreach.hpp>

#include <vector>
#include <cstdio>

//※正しいsjis文字列が入力されたかかどうかは判定してない
std::vector<std::string> split_sjis(std::string str){
	// http://charset.7jp.net/ を参照した
	std::vector<std::string> ret;
	for(size_t i=0; i < str.size(); ++i){
		unsigned char ch = str[i]; //08以上は符号付だと負になるので、一旦符号なしに代入してる
		if( 0x81 <= ch && ch <= 0x9f || 0xe0 <= ch && ch <= 0xef){
			ret.push_back( std::string()+ str[i] + str[i+1] );
			++i;
		}else{
			ret.push_back( std::string()+str[i] );
		}
	}
	return ret;
}

int main(){
	std::string line;
	while(std::getline(std::cin, line) ){
		std::vector<std::string> characters = split_sjis(line);
		for(size_t i=0; i<line.size(); i++){
			//渡すとき符号付charは符号付intに変換されるのでそのまま渡すと0x80以上にffが3個つく
			//& 0xff で 下位8bitを取り出せる(※sizeof(0xff)=4, 0xff = 0x000000ff)
			printf("%#x ",line[i]&0xff);
			//こっちでもいい
			//printf("%#x ",(unsigned char)line[i]);
		}
		std::cout << std::endl;
		BOOST_FOREACH(std::string ch, characters) std::cout << "[" << ch << "]";
		std::cout << std::endl;
	}
	return 0;
}

動作確認

俺達は...そのしわ寄せでこんな生活を強いられているんだ!
0x89 0xb4 0x92 0x42 0x82 0xcd 0x2e 0x2e 0x2e 0x82 0xbb 0x82 0xcc 0x82 0xb5 0x82
0xed 0x8a 0xf1 0x82 0xb9 0x82 0xc5 0x82 0xb1 0x82 0xf1 0x82 0xc8 0x90 0xb6 0x8a
0x88 0x82 0xf0 0x8b 0xad 0x82 0xa2 0x82 0xe7 0x82 0xea 0x82 0xc4 0x82 0xa2 0x82
0xe9 0x82 0xf1 0x82 0xbe 0x21
[][][][.][.][.][][][][][][][][][][][][][][][][][][][][][][][!]