SA-MP Forums Archive
[Tutorial] Handling utf8 data from database - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+---- Forum: Tutorials (https://sampforum.blast.hk/forumdisplay.php?fid=70)
+---- Thread: [Tutorial] Handling utf8 data from database (/showthread.php?tid=422411)



Handling utf8 data from database - Misiur - 13.03.2013

I found answer to my problem in an archive of russian section, so I guess I should share about it. Let's say you have database encoded in utf8_unicode_ci. Now, how to retrieve this data and show it properly in dialog? We'll use blueg mysql plugin.

1. Fetch and install utf8 plugin by Ryder - https://sampforum.blast.hk/showthread.php?tid=223944
pawn Code:
static dbhandle;
public OnGameModeInit() {
    dbhandle = mysql_connect(DB_HOST, DB_USER, DB_NAME, DB_PASS);
    if(mysql_ping()) {
        printf("Mysql connection succeeded");
        mysql_set_charset("utf8_unicode_ci", dbhandle);
        mysql_function_query(dbhandle, "SET NAMES 'utf8'", false, "", "");
    }
    return 1;
}
When your gamemode connects to database, we have to tell it that we're going to use utf8 encoding. Let's say that we have greeting for each user.

pawn Code:
public OnPlayerConnect(playerid) {
    new name[MAX_PLAYER_NAME+1], tmp[57 + MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof name);
    mysql_format(dbhandle, tmp, "SELECT greeting FROM `users` WHERE uname = '%s' LIMIT 0,1", name);
    mysql_function_query(dbhandle, tmp, true, "GreetPlayer", "i", playerid);
    return 1;
}
forward GreetPlayer(pid);
public GreetPlayer(pid) {
    new rows, fields, tmp[32], msg[128];
    cache_get_data(rows, fields, dbhandle);
    if(rows) {
        cache_get_row(0, 0, tmp, dbhandle);
        UTF8_Decode(tmp, tmp, sizeof tmp);
        format(msg, sizeof msg, "%s!", tmp);
        ShowPlayerDialog(pid, 1231, DIALOG_STYLE_MSGBOX, "Hell yeah", msg, "k", "");
    }
    return 1;
}
As you can see we need to decode message retrieved from database, otherwise you'll gibberish