Znaki UTF-8
R3X
26.07.2010
Znaki UTF-8
Wszystkie wyjścia tekstowe silnika HalfLife`a obsługują kodowanie UTF-8, ale kompilator amxxa już nie AMXX Studio już nie. Jak więc uzyskać dostęp do specjalnych znaków?
Można zapisać plik .sma w UTF-8 bez BOM i wtedy skompilować.
Albo ręcznie:
Godne uwagi jest to, że używane są 2 komórki pamięci na znak. Tekst złożony z 3 znaków UTF-8 będzie zatem długości 6+1.
Z tej tabeli bierzemy kod interesującego nas znaku (stronnicowane)
Unicode/UTF-8-character table
chciałbym napisać w konsoli bąk zamiast bak, znalazłem
U+0105 ą c4 85 LATIN SMALL LETTER A WITH OGONEK
kod= C4 85
Pierwszy bajt wrzucamy do pierwszej komórki, drugi do drugiej; oba sumujemy bitowo z 0xFFFFFF00
C4 | 0xFFFFFF00 = 0xFFFFFFC4 85 | 0xFFFFFF00 = 0xFFFFFF85
new szTemp[] = { 0xFFFFFFC4, 0xFFFFFF85, 0} console_print(0, "b%sk", szTemp)

Przy znakach jednobajtowych (np. @) pierwszy bajt to 0xFF a drugi to kod znaku.
Dosyć niewygodne w użyciu, ale gdy chcesz ozdobić jakiś tekst specjalnym znakiem lub dodać ogonki do polskich tekstów to w sam raz

Edit:
Można umieścić znaki od razu w stringu:
console_print(0, "b^xC4^x85k")
G[o]Q
26.07.2010
Ciekawe a moze napisac jakas funckcje/stock gdzie jako parametr bedzie tablica i nr
nr to bedzie rodzaj litery a do tablicy bedzie wpisany kod
np
uzycie :
nr to bedzie rodzaj litery a do tablicy bedzie wpisany kod
np
public to_utf(tablica[3],wybor){ switch(wybor){ case 1:{ tablica={ 0xFFFFFFC4, 0xFFFFFF85, 0} } } }
uzycie :
new tab[3] to_utf(tab,1) console_print(0, "b%sk",tab)
R3X
27.07.2010
#define PL_A 0xC485 stock utf8(c){ new szTemp[3]; szTemp[0] = (c&0x0000FF00)>>8 | 0xFFFFFF00; szTemp[1] = (c&0x000000FF) | 0xFFFFFF00; szTemp[2] = 0; return szTemp; } public next(){ console_print(0, "b%sk", utf8(PL_A) ); }można dorobić więcej stałych i .inca skleić
Edit.
Haha

client_cmd(id, "say ^"Cze%s%s^"", utf8(0xC59B), utf8(0xC487));
Gość_Maestro_* 27.07.2010
A jak np dodam langi i ten plik langow zapisze w UTF-8, i mam tam polskie znaki to wyswietli je?
Apple()
27.07.2010
Nie, te polskie znaki masz mieć w kompilatorze(tzn nie polskie a za pomocą bitów zapisujesz je na polskie) a kompilator ma info z bitów że tu będzie polski znak "ą" i "ś" i konwertuje to do pluginu amxx. Ciekawe jak to w praktyce na hudmessage

diablix
27.07.2010
Hmm a jeżeli chce zrobić, że jeżeli gracz wpisze "coś" i to "coś" bedzię zawierać "a" to żeby zmieniło na ą to jak to mam zrobić? Próbowałem tak
ale zawsze same ą bylo
EDIT: Tak, juz wiem ze moglem to zrobic przez client_cmd
Edited by Diablix, 27.07.2010 12:41.
public handle_say(id) {
new said[192]
new name[33]
get_user_name(id, name, 32)
new szTemp[] = { 0xFFFFFFC4, 0xFFFFFF85, 0}
read_args(said,192)
if( ( containi(said, "!a") != -1 )){
#if defined _colorchat_included
ColorChat(0, NORMAL, "^x03%s^x01 : %s", name, szTemp)
#endif
#if !defined _colorchat_included
client_print(0, print_chat, "%s : %s %s", name, said, szTemp)
#endif
return PLUGIN_HANDLED
}
else
{
return PLUGIN_CONTINUE
}
return 1
}
ale zawsze same ą bylo

EDIT: Tak, juz wiem ze moglem to zrobic przez client_cmd

Edited by Diablix, 27.07.2010 12:41.
R3X
27.07.2010
@Maestro
@Apple()
te znaki lekko odcinają się od reszty, pisane są inną czcionką
@Diablix
replace_all
tak też zadziałajak np. dodam langi i ten plik langow zapisze w UTF-8
@Apple()
te znaki lekko odcinają się od reszty, pisane są inną czcionką

@Diablix
replace_all

replace_all(said, charsmax(said), "!a", szTemp);
diablix
27.07.2010
Hmm co jest nie tak? Wpisuje !a i sie pokazuje normalnie !a 

public handle_say(id) {
new said[192]
new szTemp[20] = { 0xFFFFFFC4, 0xFFFFFF85, 0}
read_args(said,192)
if( ( containi(said, "!a") != -1 )){
replace_all(said, charsmax(said), "!a", szTemp)
}
}
Kubaczek <3
28.07.2010
Ja mam if(equali...) i pyka. I nie kopiuj ode mnie pomysłu z !a
Sprobój zmienić read_args(said,192) na read_args(id,said,192). Zamiast replace_all mam też replace(...)
Edited by kubaku4, 28.07.2010 05:37.

Edited by kubaku4, 28.07.2010 05:37.
DarkGL
19.01.2011
to nie obciąża w jakiś specjalny sposób to jest tylko informacja dla kompilatora

kam7
29.06.2011
Miczu sposób z kodowaniem UTF-8 działa, jednak nie do końca.
Jeżeli wiadomość jest wyświetlana bezpośrednio w konsoli polskie znaki działają.
Jeżeli wiadomość jest wyświetlana na ekranie podczas gry, polskie znaki również działają,
lecz potem ta wiadomość w konsoli (po jakimś czasie wiadomości na say, itd. pojawiają się w konsoli) nie posiada polskich znaków.
Np piszemy na say: timeleft
Serwer zwraca: Pozostało czasu: ...
Ale w konsoli pojawia się: Pozostao czasu: ...
Można jakoś zaradzić w 'przenoszeniu' tych znaków? nie chodzi mi tu o inne sposoby opisane w temacie typu pluginy.
Edited by kam7, 29.06.2011 12:41.
Jeżeli wiadomość jest wyświetlana bezpośrednio w konsoli polskie znaki działają.
Jeżeli wiadomość jest wyświetlana na ekranie podczas gry, polskie znaki również działają,
lecz potem ta wiadomość w konsoli (po jakimś czasie wiadomości na say, itd. pojawiają się w konsoli) nie posiada polskich znaków.
Np piszemy na say: timeleft
Serwer zwraca: Pozostało czasu: ...
Ale w konsoli pojawia się: Pozostao czasu: ...
Można jakoś zaradzić w 'przenoszeniu' tych znaków? nie chodzi mi tu o inne sposoby opisane w temacie typu pluginy.
Edited by kam7, 29.06.2011 12:41.
R3X
30.06.2011
Nie wiem czy można coś z tym zrobić.
Metodę opisaną w tym temacie można skrócić do zapisu
dla
Metodę opisaną w tym temacie można skrócić do zapisu
dla
U+0119 ę c4 99 LATIN SMALL LETTER E WITH OGONEK
log_amx("Testuj^xC4^x99");
ErroR'S
30.06.2011
#include <amxmodx> #include <amxmisc> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "Miczu" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /test","test_test") } public test_test(id) { client_print(0,print_chat,"ęąśżźćółń ĘĄŚŻŹĆÓŁŃ") }
Jak bym zamienił to na
#include <amxmodx> #include <amxmisc> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "Miczu" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say !a ","test_test") } public test_test(id) { client_print(0,print_chat,"ą") }
To po wpisaniu na say !a wyświetli mi się ą? Bo niewiem czy dobrze załapałem bo jeśli tak to napisze pare takich wersji na każdą polską literę