←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Znaki UTF-8

  • +
  • -
R3X's Photo 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)
amxx.pl-1280179335-U2873.jpg

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 smile.gif


Edit:
Można umieścić znaki od razu w stringu:
console_print(0, "b^xC4^x85k")
Quote

  • +
  • -
G[o]Q's Photo 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
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)

Quote

  • +
  • -
R3X's Photo 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 xD
client_cmd(id, "say ^"Cze%s%s^"", utf8(0xC59B), utf8(0xC487));
Quote

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?
Quote

  • +
  • -
Apple()'s Photo 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 :)
Quote

  • +
  • -
diablix's Photo 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

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 :P

EDIT: Tak, juz wiem ze moglem to zrobic przez client_cmd :P
Edited by Diablix, 27.07.2010 12:41.
Quote

  • +
  • -
R3X's Photo R3X 27.07.2010

@Maestro

jak np. dodam langi i ten plik langow zapisze w UTF-8

tak też zadziała

@Apple()
te znaki lekko odcinają się od reszty, pisane są inną czcionką :P

@Diablix
replace_all

replace_all(said, charsmax(said), "!a", szTemp);
Quote

  • +
  • -
Miczu's Photo Miczu 27.07.2010

Czytałem o tym już jakiś czas temu... R3X można łatwiej:

Spoiler
Quote

  • +
  • -
diablix's Photo diablix 27.07.2010

Hmm co jest nie tak? Wpisuje !a i sie pokazuje normalnie !a :D

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)
}
}
Quote

  • +
  • -
Kubaczek <3's Photo Kubaczek <3 28.07.2010

Ja mam if(equali...) i pyka. I nie kopiuj ode mnie pomysłu z !a :D 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.
Quote

  • +
  • -
dayman's Photo dayman 19.09.2010

Czy takie wstawianie polskich znaków obciąża bardziej serwer ?
Quote

  • +
  • -
DarkGL's Photo DarkGL 19.01.2011

to nie obciąża w jakiś specjalny sposób to jest tylko informacja dla kompilatora -_-
Quote

  • +
  • -
kam7's Photo 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.
Quote

  • +
  • -
R3X's Photo 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

U+0119 ę c4 99 LATIN SMALL LETTER E WITH OGONEK

log_amx("Testuj^xC4^x99");
Quote

  • +
  • -
ErroR'S's Photo 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ę
Quote

  • +
  • -
R3X's Photo R3X 30.06.2011

Tak to zadziała jak skompilujesz sma kodowane w UTF-8 właśnie
Quote