tolower

#include <locale>
#include <iostream>
#include <string>

int main()
{
	std::locale loc("ja_JP.UTF-8");
	const std::ctype<char>& cty = std::use_facet<std::ctype<char> >(loc);

	std::string str = "HELLO WORLD.";
	std::cout << str << std::endl;
	
	for (std::string::iterator itor = str.begin();
		 itor != str.end(); ++itor)
		*itor = cty.tolower(*itor);
	std::cout << str << std::endl;

	const std::ctype<wchar_t>& wcty = std::use_facet<std::ctype<wchar_t> >(loc);
	
	std::wstring wstr = L"HELLO WORLD.";
	std::wcout << wstr << std::endl;
	
	for (std::wstring::iterator itor = wstr.begin();
		 itor != wstr.end(); ++itor)
		*itor = wcty.tolower(*itor);
	std::wcout << wstr << std::endl;

	return 0;
}

C++的にはlocaleオブジェクトからctypeファセットを取り出してそれを使ってtolower、と言うのが正しいやり方じゃないかと。
メドいですが。

あとUnicode文字コードだと結局Unicodeの等価性 - WikipediaとかもあるのでUTF-16とかUTF-32とかに揃えた上でICU - International Components for Unicodeとかに丸投げしちゃうんだろうしなぁ・・・