DA

[lua] unicode2latin1(str)

Por dalvorsn, 02 de out. de 2016 em Mods, funções e outros

9
2.3k
dalvorsnD
02 de outubro de 2016 às 23:26

unicode2latin1(str)

 

    A função recebe como parametro uma string 'str', e procura nela ocorrencias de unicode/utf8 dos principais acentos usados e converte para latin1/iso-8859-1.
Não é feita a conversão de todos os caracteres possíveis, pois não é bem o intuito da função, mas caso queira adicionar basta incluir no map de caracteres. Os demais caracteres estão disponiveis nesta tabela.

function unicode2latin1(str) 	local map = {		-- ÁáÀàÂâÃã		{utf = {0xc3, 0x81}, latin =  0xc1}, -- Á		{utf = {0xc3, 0xa1}, latin =  0xe1}, -- á		{utf = {0xc3, 0x80}, latin =  0xc0}, -- À		{utf = {0xc3, 0xa0}, latin =  0xe0}, -- à		{utf = {0xc3, 0x82}, latin =  0xc2}, -- Â		{utf = {0xc3, 0xa2}, latin =  0xe2}, -- â		{utf = {0xc3, 0x83}, latin =  0xc3}, -- Ã		{utf = {0xc3, 0xa3}, latin =  0xe3}, -- ã		-- ÉéÈèÊê		{utf = {0xc3, 0x89}, latin =  0xc9}, -- É		{utf = {0xc3, 0xa9}, latin =  0xe9}, -- é		{utf = {0xc3, 0x88}, latin =  0xc8}, -- È		{utf = {0xc3, 0xa8}, latin =  0xe8}, -- è		{utf = {0xc3, 0x8a}, latin =  0xca}, -- Ê		{utf = {0xc3, 0xaa}, latin =  0xea}, -- ê		-- ÍíÌìÎî		{utf = {0xc3, 0x8d}, latin =  0xcc}, -- Í		{utf = {0xc3, 0xad}, latin =  0xec}, -- í		{utf = {0xc3, 0x8c}, latin =  0xcd}, -- Ì		{utf = {0xc3, 0xac}, latin =  0xed}, -- ì		{utf = {0xc3, 0x8e}, latin =  0xce}, -- Î		{utf = {0xc3, 0xae}, latin =  0xee}, -- î		-- ÓóÒòÔôÕõ		{utf = {0xc3, 0x93}, latin =  0xd3}, -- Ó		{utf = {0xc3, 0xb3}, latin =  0xf3}, -- ó		{utf = {0xc3, 0x92}, latin =  0xd2}, -- Ò		{utf = {0xc3, 0xb2}, latin =  0xf2}, -- ò		{utf = {0xc3, 0x94}, latin =  0xd4}, -- Ô		{utf = {0xc3, 0xb4}, latin =  0xf4}, -- ô		{utf = {0xc3, 0x95}, latin =  0xd5}, -- Õ		{utf = {0xc3, 0xb5}, latin =  0xf5}, -- õ		-- ÚúÙùÛû		{utf = {0xc3, 0x9a}, latin =  0xda}, -- Ú		{utf = {0xc3, 0xba}, latin =  0xfa}, -- ú		{utf = {0xc3, 0x99}, latin =  0xd9}, -- Ù		{utf = {0xc3, 0xb9}, latin =  0xf9}, -- ù		{utf = {0xc3, 0x9b}, latin =  0xdb}, -- Û		{utf = {0xc3, 0xbb}, latin =  0xfb}, -- û		-- Çç		{utf = {0xc3, 0x87}, latin =  0xc7}, -- Ç		{utf = {0xc3, 0xa7}, latin =  0xe7}  -- ç	}	if type(str) == "string" then		for i = 1, #map do 			str = str:gsub(string.char(unpack(map[i].utf)),  string.char(map[i].latin))		end	end	return strend

 

wougoplexW
02 de outubro de 2016 às 23:36
9 minutos atrás, dalvorsn disse:

unicode2latin1(str)

 

    A função recebe como parametro uma string 'str', e procura nela ocorrencias de unicode/utf8 dos principais acentos usados e converte para latin1/iso-8859-1.

Não é feita a conversão de todos os caracteres possíveis, pois não é bem o intuito da função, mas caso queira adicionar basta incluir no map de caracteres. Os demais caracteres estão disponiveis nesta tabela.

function unicode2latin1(str) 	local map = {		-- ÁáÀàÂâÃã		{utf = {0xc3, 0x81}, latin =  0xc1}, -- Á		{utf = {0xc3, 0xa1}, latin =  0xe1}, -- á		{utf = {0xc3, 0x80}, latin =  0xc0}, -- À		{utf = {0xc3, 0xa0}, latin =  0xe0}, -- à		{utf = {0xc3, 0x82}, latin =  0xc2}, -- Â		{utf = {0xc3, 0xa2}, latin =  0xe2}, -- â		{utf = {0xc3, 0x83}, latin =  0xc3}, -- Ã		{utf = {0xc3, 0xa3}, latin =  0xe3}, -- ã		-- ÉéÈèÊê		{utf = {0xc3, 0x89}, latin =  0xc9}, -- É		{utf = {0xc3, 0xa9}, latin =  0xe9}, -- é		{utf = {0xc3, 0x88}, latin =  0xc8}, -- È		{utf = {0xc3, 0xa8}, latin =  0xe8}, -- è		{utf = {0xc3, 0x8a}, latin =  0xca}, -- Ê		{utf = {0xc3, 0xaa}, latin =  0xea}, -- ê		-- ÍíÌìÎî		{utf = {0xc3, 0x8d}, latin =  0xcc}, -- Í		{utf = {0xc3, 0xad}, latin =  0xec}, -- í		{utf = {0xc3, 0x8c}, latin =  0xcd}, -- Ì		{utf = {0xc3, 0xac}, latin =  0xed}, -- ì		{utf = {0xc3, 0x8e}, latin =  0xce}, -- Î		{utf = {0xc3, 0xae}, latin =  0xee}, -- î		-- ÓóÒòÔôÕõ		{utf = {0xc3, 0x93}, latin =  0xd3}, -- Ó		{utf = {0xc3, 0xb3}, latin =  0xf3}, -- ó		{utf = {0xc3, 0x92}, latin =  0xd2}, -- Ò		{utf = {0xc3, 0xb2}, latin =  0xf2}, -- ò		{utf = {0xc3, 0x94}, latin =  0xd4}, -- Ô		{utf = {0xc3, 0xb4}, latin =  0xf4}, -- ô		{utf = {0xc3, 0x95}, latin =  0xd5}, -- Õ		{utf = {0xc3, 0xb5}, latin =  0xf5}, -- õ		-- ÚúÙùÛû		{utf = {0xc3, 0x9a}, latin =  0xda}, -- Ú		{utf = {0xc3, 0xba}, latin =  0xfa}, -- ú		{utf = {0xc3, 0x99}, latin =  0xd9}, -- Ù		{utf = {0xc3, 0xb9}, latin =  0xf9}, -- ù		{utf = {0xc3, 0x9b}, latin =  0xdb}, -- Û		{utf = {0xc3, 0xbb}, latin =  0xfb}, -- û		-- Çç		{utf = {0xc3, 0x87}, latin =  0xc7}, -- Ç		{utf = {0xc3, 0xa7}, latin =  0xe7}  -- ç	}	if type(str) == "string" then		for i = 1, #map do 			str = str:gsub(string.char(unpack(map[i].utf)),  string.char(map[i].latin))		end	end	return strend

 

Pra que serve ?

dalvorsnD
02 de outubro de 2016 às 23:40

Bom, ai vai variar de como usa, mas por exemplo se quiser que os npcs se comuniquem com acentuação brasileira, com essa função fica facil, porque tu converte o texto pra um formato que o cliente consegue interpretar e acentuar corretamente, e para não ficar algo pesado eu deixei mais voltado pros acentos mesmo. Se voce tiver um pouco mais de conhecimento da pra alterar o look de sigs, items e etc. Enfim, o modo que vai usar é contigo, mas a função é codificar os acentos.

AdministradorA
02 de outubro de 2016 às 23:51

Ótima contribuição com certeza, é realmente chato ter que se limitar a acentos no Tibia, as vezes.

LordfireL
03 de outubro de 2016 às 02:53

Ué, mas Unicode tem suporte a todos os caracteres ._. o client usa latin1?

dalvorsnD
03 de outubro de 2016 às 08:12
4 horas atrás, Lordfire disse:

Ué, mas Unicode tem suporte a todos os caracteres ._. o client usa latin1?

Não cheguei a testar no cliente do tibia, mas no otclient pelo menos ele usa o cp1252, sempre configura pro locale do pc que ta rodando.

DeadpoolD
03 de outubro de 2016 às 09:10

É um ótimo conteúdo.
Eu usava a opção de converter no notepad. uaheudh

Curti, ficou bacana. 

LordfireL
04 de outubro de 2016 às 00:30
16 horas atrás, dalvorsn disse:

Não cheguei a testar no cliente do tibia, mas no otclient pelo menos ele usa o cp1252, sempre configura pro locale do pc que ta rodando.

Ah, assumo que vc programa no Windows então, o que é um problema ahuauhauhauha

dalvorsnD
04 de outubro de 2016 às 00:37
6 minutos atrás, Lordfire disse:

Ah, assumo que vc programa no Windows então, o que é um problema ahuauhauhauha

Buga os acentos nos dois

Na real eu programo a maioria do tempo no linux, só quando preciso mesmo que eu vou pro windows(sofrido isso)