I was able to get "unac" running under windows - after re-writting the front-end for wchar_t strings...
Original source: http://www.senga.org/download/unac/
Modified source attached (rename to .zip)
Code:
#include <iostream>
using namespace std;
#include "unac.h"
int unac_string(const wchar_t *in, size_t in_length,
wchar_t *out, size_t &out_length)
{
if (!out || !out_length)
return -1;
if (in_length == -1)
in_length = wcslen(in);
int out_size = out_length;
out_length = 0;
int i;
for (i = 0; i < in_length; ++i)
{
wchar_t *p;
int l;
wchar_t c = in[i];
// Lookup the tables for decomposition information
unac_char_utf16(c, p, l);
// Make sure there is enough space to hold the decomposition
if (out_length + l + 1 >= out_size)
return -2;
if (l > 0)
{
// If there is a decomposition, insert it in the output string.
for (int k = 0; k < l; ++k)
out[out_length++] = p[k];
}
else
{
// If there is no decomposition leave it unchanged
out[out_length++] = in[i];
}//else
}//for
out[out_length] = '\0';
return 0;
}//unac_string
int main()
{
const wchar_t *p = //L"Lÿdia ñ";
L"\"La mort d'Olivier Bécaille\" -- Émile Zola;\n"
L"\"Das Vermächtnis des alten Pilgers\" von Rainer M. Schröder (Österreich, ÖVP);\n"
L"\"Smyccový koncert As dur\" -- Antonín Dvorák.";
wchar_t out_buff[1024];
size_t out_len = sizeof(out_buff)/sizeof(*out_buff);
int res = unac_string(p, -1, out_buff, out_len);
cout << res << endl;
cout << out_len << endl;
char buff[1024];
wcstombs(buff, out_buff, sizeof(buff));
cout << buff << endl;
// check buff for any non-7bit characters
return 0;
}//main
However, this won't convert ß to ss. For something like that there's the ICU library: http://icu-project.org/
You can play with the differenct transformations it can do here: http://demo.icu-project.org/icu-bin/translit
gg