» »

[Java] Prevajanje in šumniki v ubuntu

[Java] Prevajanje in šumniki v ubuntu

mmaestro ::

Spisan imam program, ki mi iz maila ob določenih dogodkih pošilja sms sporočila.

V metodi checkMail ven sparsam določeno vsebino za nekatera sporočila, ki pridejo iz maila v UTF obliki jih pretvorim v Windows-1252 da dobim šumnike nazaj.
V glavnem problem se pojavi, ker če to kodo laufam na exlipse dela ok, tako kot more.
Potem jo dam na server ubuntu in kot prvo sem naletel na težavo, da nisem mogel prevesti java faila ker mi je javljalo
error: unmappable character for encoding UTF-8.

Zaradi tega sem javac MojProgram.java zamenjal z ukazom javac -encoding ISO-8859-1 MojProgram.java. Program se normalno prevede in ko ga zaženem imam problem, da mi noče konvertirati šumnikov nazaj v nešumnike.

Ima kdo kako idejo?


	private static Charset CHARSET_WINDOWS1252 = Charset.forName("Windows-1252");
	private static Charset CHARSET_ISO88591 = Charset.forName("ISO-8859-1");
	private static Charset CHARSET_UTF8 = Charset.forName("UTF-8");

	byte[] bytes = mailBody.getBytes(CHARSET_WINDOWS1252);
	mailBody = new String(bytes, CHARSET_UTF8);



private static void readGmail()
	{
		 String mailFrom = "";
	     String mailBody = "";
	     String mailSubject = "";
	     Date mailRecieved = new Date();
	
	     try {
	    	 
	    	Properties props = System.getProperties();
		    props.setProperty("mail.store.protocol", "imaps");
	    	 
			Session session = Session.getDefaultInstance(props, null);
			Store store = session.getStore("imaps");
			store.connect("imap.gmail.com", GMAIL_USERNAME, GMAIL_PASSWORD);
	
			Folder inbox = store.getFolder("Inbox");
			inbox.open(Folder.READ_ONLY);
			Message messages[] = inbox.getMessages();

			int i = 1;
			for(Message message:messages) {
				
				mailFrom = message.getFrom()[0].toString();
				mailRecieved = message.getReceivedDate();
				mailSubject = message.getSubject();
							
				printProgBar(i * 100 / messages.length);
				i++;
				
				// Read just mails within last 24 hours
				if (mailRecieved.after(new Date(System.currentTimeMillis()-86400*1000))) {
					
					Object content = message.getContent(); 

				    if (content instanceof String)  
				    {  
				    	mailBody = (String)content;  
					}  
					else if (content instanceof Multipart)  
					{  
					    Multipart mp = (Multipart)content;  
					    mailBody = mp.toString();
					    
					    if (mailBody.contains("javax.mail.internet.MimeMultipart"))
					    {
					    	String body = "";
						    for(int j=0; j<mp.getCount(); j++) {
						    	   MimeBodyPart part = (MimeBodyPart) mp.getBodyPart(j);
						    	   body += part.getContent().toString();
						    	}
						    mailBody = body;
					    }					   
				    }  


					checkMail(mailFrom, mailSubject, mailBody, mailRecieved);
					
				}
	
			}
			
			store.close();
			
		} catch (Exception e) {
            //e.printStackTrace();
		}
	
	}



	    private static String removeSpecialCharacters(String text)
	    {
	    	text = text.replace("Č", "C");
	    	text = text.replace("č", "c");
	    	text = text.replace("Ž", "Z");
	    	text = text.replace("ž", "z");
	    	text = text.replace("Š", "S");
	    	text = text.replace("š", "s");
	    	text = text.replace("Ć", "C");
	    	text = text.replace("ć", "c");
	    	text = text.replace("Đ", "D");
	    	text = text.replace("đ", "d");
	    	
	    	text = text.replace("á", "a");
	    	text = text.replace("é", "e");
	    	text = text.replace("ě", "e");
	    	text = text.replace("í", "i");
	    	text = text.replace("ň", "n");
	    	text = text.replace("ó", "o");
	    	text = text.replace("ř", "r");
	    	text = text.replace("ú", "u");
	    	text = text.replace("ů", "u");
	    	text = text.replace("ý", "y");
	    	
	    	text = text.replace("Á", "A");
	    	text = text.replace("Ď", "D");
	    	text = text.replace("É", "E");
	    	text = text.replace("Ě", "E");
	    	text = text.replace("Í", "I");
	    	text = text.replace("Ň", "N");
	    	text = text.replace("Ó", "O");
	    	text = text.replace("Ř", "R");
	    	text = text.replace("Ť", "T");
	    	text = text.replace("Ú", "U");
	    	text = text.replace("Ů", "U");
	    	text = text.replace("Ý", "Y");
	    	
	    	return text.trim();
	    }
  • spremenil: mmaestro ()

mmaestro ::

Do sedaj sem uspel ugotoviti delno rešitev.

Nastavil sem jezik na ubuntuju na slovensko. S sledečimi ukazi.
locale-gen sl_SI
update-locale LANG=sl_SI.ISO-8859-2

Ponovno zagnal strežnik, rebildal java file in zadeva je sledeča.
Pretvori mi sledeče šumnike.
č,ć,đ medtem ko ž,š ne pretvori v z,s.

Komu kaj jasno zakaj se to zgodi?

Prav tako uspešno pretvarja češke znake, samo ž in š ne.

Math Freak ::

Kaj je prav, Windows-1252 ali 1250?

Math Freak ::

Windows-1252 @ Wikipedia

Š in Ž spadata ravno v Windows-1252, medtem ko ostale ne, lahko da je kaka povezava?

(Samo ugibam)

mmaestro ::

Ne vem.
Tudi tisto kar ne gre čez encoding se mi ne pretvarja, tako da načeloma to nebi smel biti vzrok to.

Math Freak ::

Nisem nikoli delal s temi stvarmi, tako da mal ugibam ...

byte[] bytes = mailBody.getBytes(CHARSET_WINDOWS1252);

kaj ti ta del nardi?

mmaestro ::

Če ti iskreno povem ne vem točno :)
To sem poguglal in prišel do tega, nisem pa se datajlno spuščal v podbornosti. Delalo je to pa je bilo v bistvu vse kar me je zanimalo :)

Ta dva koščka sestavljata mozaik in sicer namesto da bi v string dobil ? dobim ž kakor bi tudi moglo bit.
byte[] bytes = mailBody.getBytes(CHARSET_WINDOWS1252);
mailBody = new String(bytes, CHARSET_UTF8);

Math Freak ::

Probi sam za foro spremenit pri

private static Charset CHARSET_WINDOWS1252 = Charset.forName("Windows-1252");

tist k je v oklepaju na "Windows-1250" in povej, če je kaka sprememba =P.

Spura ::

A ti nalasc uporabljas ceski encoding? Also:
> 2013
> using windows-1250

Math Freak ::

Malo se se poigral s tem, samo mi nič ne pretvarja ... verjetno kaj narobe delam lol.

String line3 = in.readLine();
    byte[] bytes1 = line3.getBytes(CHARSET_WINDOWS1252);
    System.out.print("Datoteka kodirana v utf8: AbCčČćĆšŠžŽ\n");
    System.out.print("a.)Windows 1252 -> Windows 1252: " + new String(bytes1,CHARSET_WINDOWS1252) + "\n");
    byte[] bytes2 = line3.getBytes(CHARSET_WINDOWS1252);
    System.out.print("b.)Windows 1252 -> UTF8: " + new String(bytes2,CHARSET_UTF8)+ "\n");
    byte[] bytes3 = line3.getBytes(CHARSET_UTF8);
    System.out.print("c.)UTF8 -> UTF8: " + new String(bytes3,CHARSET_UTF8)+ "\n");
    byte[] bytes4 = line3.getBytes(CHARSET_WINDOWS1250);
    System.out.print("d.)Windows 1250 -> UTF8: " + new String(bytes4,CHARSET_UTF8)+ "\n");
    byte[] bytes5 = line3.getBytes(CHARSET_WINDOWS1250);
    System.out.print("e.)Windows 1250 -> Windows 1250: " + new String(bytes5,CHARSET_WINDOWS1250)+ "\n");}}


Rezultat:
run:
Datoteka kodirana v utf8: AbCčČćĆšŠžŽ
a.)Windows 1252 -> Windows 1252: ?AbC????šŠžŽ
b.)Windows 1252 -> UTF8: ?AbC????????
c.)UTF8 -> UTF8: AbCčČćĆšŠžŽ
d.)Windows 1250 -> UTF8: ?AbC???????
e.)Windows 1250 -> Windows 1250: ?AbCčČćĆšŠžŽ
BUILD SUCCESSFUL (total time: 0 seconds)


Sklepam, da ti š,Š,ž,Ž ne pretvori, ker jih prepozna kot normalni črki?

mmaestro ::

Sem sprobal zdaj na ta način.
Malo sem spremenil kodo oz dodal par printlinov in sicer zgleda koda tako.


private static String removeSpecialCharacters(String text)
	    {
	    	System.out.println("Received char: " + text);
	    	System.out.println("Received char ASCII: " + (int)text.charAt(0));
	    	
	    	System.out.println("char Š");
	    	System.out.println("Š char ASCII: " + (int)"Š".charAt(0));
	    	
	    	System.out.println("char Ž");
	    	System.out.println("Ž char ASCII: " + (int)"Ž".charAt(0));
	    	
	    	System.out.println("char š");
	    	System.out.println("š char ASCII: " + (int)"š".charAt(0));
	    	
	    	System.out.println("char ž");
	    	System.out.println("ž char ASCII: " + (int)"ž".charAt(0));
	    	
	    	text = text.replace("Č", "C");
	    	text = text.replace("č", "c");
	    	text = text.replace("Ž", "Z");
	    	text = text.replace("ž", "z");
	    	text = text.replace("Š", "S");
	    	text = text.replace("š", "s");
	    	text = text.replace("Ć", "C");
	    	text = text.replace("ć", "c");
	    	text = text.replace("Đ", "D");
	    	text = text.replace("đ", "d");
	    	
	    	text = text.replace("á", "a");
	    	text = text.replace("é", "e");
	    	text = text.replace("ě", "e");
	    	text = text.replace("í", "i");
	    	text = text.replace("ň", "n");
	    	text = text.replace("ó", "o");
	    	text = text.replace("ř", "r");
	    	text = text.replace("ú", "u");
	    	text = text.replace("ů", "u");
	    	text = text.replace("ý", "y");
	    	
	    	text = text.replace("Á", "A");
	    	text = text.replace("Ď", "D");
	    	text = text.replace("É", "E");
	    	text = text.replace("Ě", "E");
	    	text = text.replace("Í", "I");
	    	text = text.replace("Ň", "N");
	    	text = text.replace("Ó", "O");
	    	text = text.replace("Ř", "R");
	    	text = text.replace("Ť", "T");
	    	text = text.replace("Ú", "U");
	    	text = text.replace("Ů", "U");
	    	text = text.replace("Ý", "Y");
	    	
	    	System.out.println("Changed text: " + text);
	    	
	    	return text.trim();
	    }



Kot input iz maila sem prabral črko š in dobim to:

Received char: š
Received char ASCII: 353
char ?
? char ASCII: 138
char ?
? char ASCII: 142
char ?
? char ASCII: 154
char ?
? char ASCII: 158
Changed text: š

Se pravi ASCII od šja ki ga dobim noter in š-ja kateri je v kodi je čisto različen.
Zakaj pa niti približno se mie ne sanja.

mmaestro ::

Evo mi je bilo dost jahanja s temi znaki. Nekatere konvertira nekatere ne, nič jasno, niti se mi več ne da s tem ukvarjat. Škoda da nisem prej na to pomislil :)

Sem naredil trotel ziher.


private static String removeSpecialCharacters(String text)
	    {
	    	text = text.replace("Č", "C");
	    	text = text.replace("č", "c");
	    	text = text.replace("Ž", "Z");
	    	text = text.replace("ž", "z");
	    	text = text.replace("Š", "S");
	    	text = text.replace("š", "s");
	    	text = text.replace("Ć", "C");
	    	text = text.replace("ć", "c");
	    	text = text.replace("Đ", "D");
	    	text = text.replace("đ", "d");
	    	
	    	//č,Č,ć,Ć,š,Š,ž,Ž,EUR
	    	text = text.replace((char)269, 'c');
	    	text = text.replace((char)268, 'C');
	    	text = text.replace((char)263, 'c');
	    	text = text.replace((char)262, 'C');
	    	text = text.replace((char)382, 'z');
	    	text = text.replace((char)381, 'Z');
	    	text = text.replace((char)353, 's');
	    	text = text.replace((char)352, 'S');
	    	text = text.replace((char)373, 'd');
	    	text = text.replace((char)272, 'D');
	    	text = text.replace((char)128, (char)8364); //euro

	    	text = text.replace("á", "a");
	    	text = text.replace("é", "e");
	    	text = text.replace("ě", "e");
	    	text = text.replace("í", "i");
	    	text = text.replace("ň", "n");
	    	text = text.replace("ó", "o");
	    	text = text.replace("ř", "r");
	    	text = text.replace("ú", "u");
	    	text = text.replace("ů", "u");
	    	text = text.replace("ý", "y");
	    	
	    	text = text.replace("Á", "A");
	    	text = text.replace("Ď", "D");
	    	text = text.replace("É", "E");
	    	text = text.replace("Ě", "E");
	    	text = text.replace("Í", "I");
	    	text = text.replace("Ň", "N");
	    	text = text.replace("Ó", "O");
	    	text = text.replace("Ř", "R");
	    	text = text.replace("Ť", "T");
	    	text = text.replace("Ú", "U");
	    	text = text.replace("Ů", "U");
	    	text = text.replace("Ý", "Y");
	    	
	    	//ě,Ě,ň,Ň,ř,Ř,ů,Ů,Ď,Ť
	    	text = text.replace((char)283, 'e');
	    	text = text.replace((char)282, 'E');
	    	text = text.replace((char)328, 'n');
	    	text = text.replace((char)327, 'N');
	    	text = text.replace((char)345, 'r');
	    	text = text.replace((char)344, 'R');
	    	text = text.replace((char)367, 'r');
	    	text = text.replace((char)366, 'R');
	    	text = text.replace((char)270, 'D');
	    	text = text.replace((char)356, 'T');
	    	
	    	return text.trim();
	    }

Zgodovina sprememb…

  • spremenil: mmaestro ()

Senitel ::

BTW: A kakšnih for zank vas še niso naučili?

Math Freak ::

@Senitel

Lol, njega očitno zanimajo šumniki, dobi pa nasvete za vse ostalo ...

Izgleda je zmešnjava po katerem načinu program / mail kodira znake. S "System.out.println(System.getProperty("file.encoding"));" lahko pogledaš za konec, če ti kodira na enak način v ubuntu in exlipse. Važn da je problem rešn =p.

mmaestro ::

Ma dobro imaš prav no :) ni ravno najlepše. Je sproti nastajalo in pol nisem dajal v array vseh znakov, čeprav bi bilo dosti lepše :)
Bom naredil tako :)
Važno da zdaj dela tako kot sem že prej mislil da bo.

Spura ::

Zelo simpl je. Mail ki ga prejmes ima podan encoding, uporabis ta encoding. Ne vem kaj pol pocnes s to stvarjo, ampak encoding podatkov maila je trivialna stvar. Pol mas neko funkcijo k sumnike odstranjuje, k ne razumem zakaj jo rabis. Ampak v osnovi je problem s to funkcijo to, da imas notr string literale s sumniki in naekrat postane encoding source kode problem. To si se sam nafukal, ker tlacis sumnike v source in pol dajes ta source na drug sistem.

                        Multipart mp = (Multipart)content;  
                        mailBody = mp.toString();
                         
                        if (mailBody.contains("javax.mail.internet.MimeMultipart"))

What the fuck je to zakaj ne uporabis preprosto instanceof operatorja?

MrStein ::

1.) Encoding Java source fajlov
Kakšen je?
Kakšnen encoding uporablja prevajalnik javac (ali katerega si pač uporabil)?

2.) Zagon programa.
A java JRE uporablja encoding, ki je enak tistemu, ki ga uporablja OS? (oziroma terminal, preostali OS nima veze, tisti reboot je bil popolnoma nepotreben ;))
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Zgodovina sprememb…

  • spremenil: MrStein ()

MrStein ::

Probaj tole prevest (je "suhi" ASCII, tako da je v tem koraku encoding vseeno) in pognat:
// shrani kot Test1.java
public class Test1 {
public static void main(String[] args) {
    System.out.println("\u010c\u010d\u0160\u0161\u017d\u017e");
  }
}

Moralo bi izpisati "Č芚Žž".
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

MrStein ::

mmaestro je izjavil:


javac -encoding ISO-8859-1 MojProgram.java.

To sigurno ni prav, ker ISO-8859-1 ne pozna šumnikov, ti pa jih imaš v programu (v source kodi).

Sicer pa:
- Java ima že knjižnice, kjer pretvori č-je v c-je. Mogoče:
String mailBody;
bytes [] brez_sumnikov = mailBody.getBytes(Charset.forName("US-ASCII"));

- večina SMS storitev že sama odstrani/pretvori nepodprte znake in ne rabiš ti to delat
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Zgodovina sprememb…

  • spremenil: MrStein ()

MrStein ::

update-locale LANG=sl_SI.ISO-8859-2

Ajoj...
Daj to nazaj kot je bilo.
Ubuntu po defoltu uporablja UTF-8 ("vsi znaki, ki jih je človeštvo kdajkoli uporabljajo in poznalo").
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

mmaestro ::

MrStein je izjavil:

update-locale LANG=sl_SI.ISO-8859-2

Ajoj...
Daj to nazaj kot je bilo.
Ubuntu po defoltu uporablja UTF-8 ("vsi znaki, ki jih je človeštvo kdajkoli uporabljajo in poznalo").


To sem dal nazaj že ja, ker so se je recimo v mc programu pojavljali kar neki čudni znaki.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[php] encoding niza

Oddelek: Izdelava spletišč
173255 (1170) BivšiUser2
»

[Java]: replace - slovar v txt

Oddelek: Programiranje
121388 (1246) Spura
»

Koda kalkulatorja v MS visual C# 2008?

Oddelek: Programiranje
212586 (1923) smukC
»

C# - keypress

Oddelek: Programiranje
201338 (1069) urkrajnc
»

[java] Kako v memoriji pretvoriti String objekt v File objekt ? - neka metoda ga zaht

Oddelek: Programiranje
131642 (1642) infiniteLoop

Več podobnih tem