comapi oraz polskie znaki
Jabba - 23-11-2006 00:40
comapi oraz polskie znaki
Witam,
Ponieważ do funkcji comapi (javax.comm...) porty.getOutputStream().write() mozna podać tylko ciąg znaków w postaci tablicy byte[] pojawił się problem z wysyłaniem polskich krzaczków. Przypisanie do tablicy byte[] znaku powyżej 127 powoduje jego zmiane np na: -128. Drukarka fiskalna głupieje.
Poradźcie co tu wykombinować. czy pozostaje jedynie zmiana polskich znaków na ascii ?
Z góry wielkie dzięki za każdą sugestie.
Pozdrowienia,
oczek - 23-11-2006 00:43
On 11/3/2006 1:18 PM, Jabba wrote: > Witam, > > Ponieważ do funkcji comapi (javax.comm...) > porty.getOutputStream().write() mozna podać tylko ciąg znaków w > postaci tablicy byte[] pojawił się problem z wysyłaniem polskich > krzaczków. Przypisanie do tablicy byte[] znaku powyżej 127 powoduje > jego zmiane np na: -128. Drukarka fiskalna głupieje. > dowiedz sie jakiego kodowania uzywa drukarka i uzyj go do konwersji stringa na bajty metoda: public byte[] getBytes(String charsetName)
-- oczek
Jabba - 23-11-2006 01:16
oczek napisał(a): > On 11/3/2006 1:18 PM, Jabba wrote: > > Witam, > > > > Ponieważ do funkcji comapi (javax.comm...) > > porty.getOutputStream().write() mozna podać tylko ciąg znaków w > > postaci tablicy byte[] pojawił się problem z wysyłaniem polskich > > krzaczków. Przypisanie do tablicy byte[] znaku powyżej 127 powoduje > > jego zmiane np na: -128. Drukarka fiskalna głupieje. > > > dowiedz sie jakiego kodowania uzywa drukarka i uzyj go do > konwersji stringa na bajty metoda: > public byte[] getBytes(String charsetName) > > -- > oczek
Nieszczęsna mazovia ...
oczek - 23-11-2006 01:16
On 11/8/2006 2:49 PM, Jabba wrote: > > Nieszczęsna mazovia ... >
uuuuuuuuuuuuuuuuuuuuu... moze znajdziesz jakies gotowe klasy ale na to bym za bardzo nie liczyl raczej trzeba bedzie npisac wlasny charset z odpowiednim encodingiem tabele znakow sa latwo dostepne.
-- pozdrawiam oczek
wklaczynski - 23-11-2006 01:16
oczek napisał(a): > On 11/8/2006 2:49 PM, Jabba wrote: >> >> Nieszczęsna mazovia ... >> > > uuuuuuuuuuuuuuuuuuuuu... > moze znajdziesz jakies gotowe klasy ale na to bym za bardzo nie liczyl > raczej trzeba bedzie npisac wlasny charset z odpowiednim encodingiem > tabele znakow sa latwo dostepne. >
Napisałem kiedyś taki, jak chcesz to możesz skorzystać!
import java.nio.charset.Charset; import java.nio.charset.spi.CharsetProvider; import java.util.Iterator; import java.util.Vector;
/** * * @author Waldek */ public class DOSCharsetProvider extends CharsetProvider {
public static final String MAZOVIA_CHARSET_NAME = "CP-896"; public static final String LATIN_2_CHARSET_NAME = "CP-852"; // public static final String MAZOVIA_CHARSET_NAME = "Mazovia"; // public static final String LATIN_2_CHARSET_NAME = "IBM Latin 2";
private static Vector charsets;
public Iterator charsets() { if (charsets == null || charsets.size() == 0) { charsets = new Vector(); charsets.add(new MazoviaCharset(MAZOVIA_CHARSET_NAME, null)); charsets.add(new IBMLatinCharset(LATIN_2_CHARSET_NAME, null)); }
return charsets.iterator(); }
public Charset charsetForName(String charsetName) { if (charsetName.trim().equalsIgnoreCase(MAZOVIA_CHARS ET_NAME)){ return new MazoviaCharset(MAZOVIA_CHARSET_NAME, null); } else if (charsetName.trim().equalsIgnoreCase(LATIN_2_CHARS ET_NAME)){ return new IBMLatinCharset(LATIN_2_CHARSET_NAME, null); } else { return null; } }
}
import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult;
/** * * @author Waldek */ public class MazoviaCharset extends Charset {
private static char[][] convertChars = new char[][] { {'\u0104', 143}//Ą , {'\u0105', 134}//ą , {'\u0106', 149}//Ć , {'\u0107', 141}//ć , {'\u0118', 144}//Ę , {'\u0119', 145}//ę , {'\u0141', 156}//Ł , {'\u0142', 146}//ł , {'\u0143', 165}//Ń , {'\u0144', 164}//ń , {'\u00D3', 163}//Ó , {'\u00F3', 162}//ó , {'\u015A', 152}//Ś , {'\u015B', 158}//ś , {'\u0179', 160}//Ź , {'\u017A', 166}//ź , {'\u017B', 161}//Ż , {'\u017C', 167}//ż };
public MazoviaCharset(String canonicalName, String[] aliases) { super(canonicalName, aliases); }
public boolean contains(Charset cs) { if (cs.equals(this)) { return true; }
return false; }
public CharsetDecoder newDecoder() { return new PrivCharsetDecoder(this, 1, 1); }
public CharsetEncoder newEncoder() { return new PrivCharsetEncoder(this, 1, 1); }
public class PrivCharsetEncoder extends CharsetEncoder { public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, float maxBytesPerChar, byte[] replacement) { super(cs, averageBytesPerChar, maxBytesPerChar, replacement); }
public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, float maxBytesPerChar) { super(cs, averageBytesPerChar, maxBytesPerChar); }
protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { while (in.hasRemaining()) { char inputChar = in.get();
for (int i = 0; i < convertChars.length; i++) { if (inputChar == convertChars[i][0]) { inputChar = convertChars[i][1]; } }
out.put((byte)(inputChar & 0xFF)); } return CoderResult.UNDERFLOW; } }
public class PrivCharsetDecoder extends CharsetDecoder { public PrivCharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte) { super(cs, averageCharsPerByte, maxCharsPerByte); }
protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { while (in.hasRemaining()) { char inputChar = (char)(in.get() & 0x00FF);
for (int i = 0; i < convertChars.length; i++) { if (inputChar == convertChars[i][1]) { inputChar = convertChars[i][0]; } } out.put(inputChar); }
return CoderResult.UNDERFLOW; } }
}
import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; import java.nio.ByteBuffer; import java.nio.CharBuffer;
public class IBMLatinCharset extends Charset {
private static char[][] convertChars = new char[][] { {'\u0104', 164}//Ą , {'\u0105', 165}//ą , {'\u0106', 143}//Ć , {'\u0107', 134}//ć , {'\u0118', 168}//Ę , {'\u0119', 169}//ę , {'\u0141', 157}//Ł , {'\u0142', 136}//ł , {'\u0143', 227}//Ń , {'\u0144', 228}//ń , {'\u00D3', 224}//Ó , {'\u00F3', 162}//ó , {'\u015A', 151}//Ś , {'\u015B', 152}//ś , {'\u0179', 141}//Ź , {'\u017A', 171}//ź , {'\u017B', 189}//Ż , {'\u017C', 190}//ż };
public IBMLatinCharset(String canonicalName, String[] aliases) { super(canonicalName, aliases); }
public boolean contains(Charset cs) { if (cs.equals(this)) { return true; }
return false; }
public CharsetDecoder newDecoder() { return new PrivCharsetDecoder(this, 1, 1); }
public CharsetEncoder newEncoder() { return new PrivCharsetEncoder(this, 1, 1); }
public class PrivCharsetEncoder extends CharsetEncoder { public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, float maxBytesPerChar, byte[] replacement) { super(cs, averageBytesPerChar, maxBytesPerChar, replacement); }
public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, float maxBytesPerChar) { super(cs, averageBytesPerChar, maxBytesPerChar); }
protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { while (in.hasRemaining()) { char inputChar = in.get();
for (int i = 0; i < convertChars.length; i++) { if (inputChar == convertChars[i][0]) { inputChar = convertChars[i][1]; } }
out.put((byte)(inputChar & 0xFF)); } return CoderResult.UNDERFLOW; } }
public class PrivCharsetDecoder extends CharsetDecoder { public PrivCharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte) { super(cs, averageCharsPerByte, maxCharsPerByte); }
protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { while (in.hasRemaining()) { char inputChar = (char)(in.get() & 0x00FF);
for (int i = 0; i < convertChars.length; i++) { if (inputChar == convertChars[i][1]) { inputChar = convertChars[i][0]; } } out.put(inputChar); }
return CoderResult.UNDERFLOW; } }
}
do katalogu META-INF/services dodaj plik java.nio.charset.spi.CharsetProvider
zawierający class providera
com.utils.DOSCharsetProvider
Jabba - 23-11-2006 01:17
wklaczynski napisał(a): > oczek napisał(a): > > On 11/8/2006 2:49 PM, Jabba wrote: > >> > >> Nieszczęsna mazovia ... > >> > > > > uuuuuuuuuuuuuuuuuuuuu... > > moze znajdziesz jakies gotowe klasy ale na to bym za bardzo nie liczyl > > raczej trzeba bedzie npisac wlasny charset z odpowiednim encodingiem > > tabele znakow sa latwo dostepne. > > > > Napisałem kiedyś taki, jak chcesz to możesz skorzystać! > > import java.nio.charset.Charset; > import java.nio.charset.spi.CharsetProvider; > import java.util.Iterator; > import java.util.Vector; > > /** > * > * @author Waldek > */ > public class DOSCharsetProvider extends CharsetProvider { > > public static final String MAZOVIA_CHARSET_NAME = "CP-896"; > public static final String LATIN_2_CHARSET_NAME = "CP-852"; > // public static final String MAZOVIA_CHARSET_NAME = "Mazovia"; > // public static final String LATIN_2_CHARSET_NAME = "IBM Latin 2"; > > private static Vector charsets; > > public Iterator charsets() { > if (charsets == null || charsets.size() == 0) { > charsets = new Vector(); > charsets.add(new MazoviaCharset(MAZOVIA_CHARSET_NAME, null)); > charsets.add(new IBMLatinCharset(LATIN_2_CHARSET_NAME, null)); > } > > return charsets.iterator(); > } > > public Charset charsetForName(String charsetName) { > if (charsetName.trim().equalsIgnoreCase(MAZOVIA_CHARS ET_NAME)){ > return new MazoviaCharset(MAZOVIA_CHARSET_NAME, null); > } else if > (charsetName.trim().equalsIgnoreCase(LATIN_2_CHARS ET_NAME)){ > return new IBMLatinCharset(LATIN_2_CHARSET_NAME, null); > } else { > return null; > } > } > > > > } > > import java.nio.ByteBuffer; > import java.nio.CharBuffer; > import java.nio.charset.Charset; > import java.nio.charset.CharsetDecoder; > import java.nio.charset.CharsetEncoder; > import java.nio.charset.CoderResult; > > > /** > * > * @author Waldek > */ > public class MazoviaCharset extends Charset { > > private static char[][] convertChars = new char[][] { > {'\u0104', 143}//Ą > , {'\u0105', 134}//ą > , {'\u0106', 149}//Ć > , {'\u0107', 141}//ć > , {'\u0118', 144}//Ę > , {'\u0119', 145}//ę > , {'\u0141', 156}//Ł > , {'\u0142', 146}//ł > , {'\u0143', 165}//Ń > , {'\u0144', 164}//ń > , {'\u00D3', 163}//Ó > , {'\u00F3', 162}//ó > , {'\u015A', 152}//Ś > , {'\u015B', 158}//ś > , {'\u0179', 160}//Ź > , {'\u017A', 166}//ź > , {'\u017B', 161}//Ż > , {'\u017C', 167}//ż > }; > > > public MazoviaCharset(String canonicalName, String[] aliases) { > super(canonicalName, aliases); > } > > public boolean contains(Charset cs) { > if (cs.equals(this)) { > return true; > } > > return false; > } > > public CharsetDecoder newDecoder() { > return new PrivCharsetDecoder(this, 1, 1); > } > > public CharsetEncoder newEncoder() { > return new PrivCharsetEncoder(this, 1, 1); > } > > public class PrivCharsetEncoder extends CharsetEncoder { > public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, > float maxBytesPerChar, byte[] replacement) { > super(cs, averageBytesPerChar, maxBytesPerChar, replacement); > } > > public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, > float maxBytesPerChar) { > super(cs, averageBytesPerChar, maxBytesPerChar); > } > > protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { > while (in.hasRemaining()) { > char inputChar = in.get(); > > for (int i = 0; i < convertChars.length; i++) { > if (inputChar == convertChars[i][0]) { > inputChar = convertChars[i][1]; > } > } > > out.put((byte)(inputChar & 0xFF)); > } > return CoderResult.UNDERFLOW; > } > } > > public class PrivCharsetDecoder extends CharsetDecoder { > public PrivCharsetDecoder(Charset cs, float averageCharsPerByte, > float maxCharsPerByte) { > super(cs, averageCharsPerByte, maxCharsPerByte); > } > > protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { > while (in.hasRemaining()) { > char inputChar = (char)(in.get() & 0x00FF); > > for (int i = 0; i < convertChars.length; i++) { > if (inputChar == convertChars[i][1]) { > inputChar = convertChars[i][0]; > } > } > out.put(inputChar); > } > > return CoderResult.UNDERFLOW; > } > } > > } > > > import java.nio.charset.Charset; > import java.nio.charset.CharsetDecoder; > import java.nio.charset.CharsetEncoder; > import java.nio.charset.CoderResult; > import java.nio.ByteBuffer; > import java.nio.CharBuffer; > > public class IBMLatinCharset extends Charset { > > private static char[][] convertChars = new char[][] { > {'\u0104', 164}//Ą > , {'\u0105', 165}//ą > , {'\u0106', 143}//Ć > , {'\u0107', 134}//ć > , {'\u0118', 168}//Ę > , {'\u0119', 169}//ę > , {'\u0141', 157}//Ł > , {'\u0142', 136}//ł > , {'\u0143', 227}//Ń > , {'\u0144', 228}//ń > , {'\u00D3', 224}//Ó > , {'\u00F3', 162}//ó > , {'\u015A', 151}//Ś > , {'\u015B', 152}//ś > , {'\u0179', 141}//Ź > , {'\u017A', 171}//ź > , {'\u017B', 189}//Ż > , {'\u017C', 190}//ż > }; > > > public IBMLatinCharset(String canonicalName, String[] aliases) { > super(canonicalName, aliases); > } > > public boolean contains(Charset cs) { > if (cs.equals(this)) { > return true; > } > > return false; > } > > public CharsetDecoder newDecoder() { > return new PrivCharsetDecoder(this, 1, 1); > } > > public CharsetEncoder newEncoder() { > return new PrivCharsetEncoder(this, 1, 1); > } > > public class PrivCharsetEncoder extends CharsetEncoder { > public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, > float maxBytesPerChar, byte[] replacement) { > super(cs, averageBytesPerChar, maxBytesPerChar, replacement); > } > > public PrivCharsetEncoder(Charset cs, float averageBytesPerChar, > float maxBytesPerChar) { > super(cs, averageBytesPerChar, maxBytesPerChar); > } > > protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { > while (in.hasRemaining()) { > char inputChar = in.get(); > > for (int i = 0; i < convertChars.length; i++) { > if (inputChar == convertChars[i][0]) { > inputChar = convertChars[i][1]; > } > } > > out.put((byte)(inputChar & 0xFF)); > } > return CoderResult.UNDERFLOW; > } > } > > public class PrivCharsetDecoder extends CharsetDecoder { > public PrivCharsetDecoder(Charset cs, float averageCharsPerByte, > float maxCharsPerByte) { > super(cs, averageCharsPerByte, maxCharsPerByte); > } > > protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { > while (in.hasRemaining()) { > char inputChar = (char)(in.get() & 0x00FF); > > for (int i = 0; i < convertChars.length; i++) { > if (inputChar == convertChars[i][1]) { > inputChar = convertChars[i][0]; > } > } > out.put(inputChar); > } > > return CoderResult.UNDERFLOW; > } > } > > } > > > do katalogu META-INF/services dodaj plik > java.nio.charset.spi.CharsetProvider > > zawierający class providera > > com.utils.DOSCharsetProvider
Wielkie dzięki,
oczek - 23-11-2006 01:17
On 11/8/2006 3:54 PM, wklaczynski wrote: > oczek napisał(a): > >> On 11/8/2006 2:49 PM, Jabba wrote: >> >>> >>> Nieszczęsna mazovia ... >>> >> >> uuuuuuuuuuuuuuuuuuuuu... >> moze znajdziesz jakies gotowe klasy ale na to bym za bardzo nie liczyl >> raczej trzeba bedzie npisac wlasny charset z odpowiednim encodingiem >> tabele znakow sa latwo dostepne. >> > > Napisałem kiedyś taki, jak chcesz to możesz skorzystać! >
moze doloczysz to do http://www.freeutils.net/source/jcharset/
juz chcialem sam im cos takiego napisac ale skoro juz masz...
-- oczek
Damian - 23-11-2006 01:17
"Jabba" <jabba_pl@gazeta.pl> wrote in news:1163056854.100614.150040@k70g2000cwa.googlegr oups.com:
[ciach] > > > Wielkie dzięki,
A teraz napisz 100 razy:
"Będę ciął cytaty"
-- Damian
Jabba - 23-11-2006 01:17
Damian napisał(a): > A teraz napisz 100 razy: > > "Będę ciął cytaty" Przepraszam, będę pamiętał. Byłem trochę zajęty i pisałem tego posta szybko.
Jeszcze raz dzięki Oczek za ten Charset, chodzi w porządku. Dużo mi pomógł ale nie rozwiązałem problemu z drukarką fiskalną do końca.
Drukarka przymuje tablice byte[] kodowaną na mazowię. więc robię: byte[] tab1 = str.getBytes("CP-896") wszystko pieknie w tablicy lądują znaki przekodowane w tym ten który mnie interesuje na pozycji [8] o wartosc= - 89 (mała literka "ż")
na koniec instrukcji muszę jeszcze umieścić sumę kontrolną: zrobiłem procedurkę:
public byte[] Check(byte[] tab1) { int tym = 255; for(int a = 2; a <= tab1.length-5; a++) { tym = tym^tab1[a]; } String s = Integer.toHexString(tym); if (s.length() == 1) s = '0' + s; tab1[tab1.length-4] = (byte) s.charAt(0); tab1[tab1.length-3] = (byte) s.charAt(1); return tab1; }
Niestety o otrzymaniu ciągu rozkazów drukarka wywala błąd sumy kontrolnej. Jeżeli w ciągu nie pojawi się znak "ż"(polski krzaczek - zakodowany jako liczba ujemna) wszystko jest w porządku.
Macie jakieś pomysły ?
Pozdrawiam,
oczek - 23-11-2006 01:17
On 11/9/2006 1:29 PM, Jabba wrote:
> Damian napisał(a): > > > Jeszcze raz dzięki Oczek za ten Charset, chodzi w porządku.
chyba nie mnie sie naleza podziekowania
> int tym = 255;
tu zmieniasz precyzje obliczen
> Niestety o otrzymaniu ciągu rozkazów drukarka wywala błąd sumy > kontrolnej. przelicz to sobie na papierze a potem sprawdz w debugerze, na moje oko zmiana precyzji obliczen z 8b na 32 powoduje bledy, musisz zastosowac odpowiednio maske by poruszac sie w sferze 8b
> Jeżeli w ciągu nie pojawi się znak "ż"(polski krzaczek - zakodowany > jako liczba ujemna) wszystko jest w porządku. polski krzaczek ma wysoka wartosc i po pierwsze bedzie interpretowany jako liczba ujemna a po drugie bardziej prawdopodobne jest wystapienie przepelnienia ponad 8b co trzeba odpowiednio obsluzyc
-- oczek
Jabba - 23-11-2006 01:17
oczek napisał(a): > chyba nie mnie sie naleza podziekowania
Masz racje, sorry, Oczywiście wielkie podziękowania dla usera wklaczynski.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Import za =?ISO-8859-2?Q?pomoc=B1_EMS_Data_Import_for_?==?ISO-8859-2?Q?MySQL_-_polskie_litery=2E?=
xHarbour/CLipper/Linuks - brak polskich =?ISO-8859-2?Q?znak=F3w_?==?ISO-8859-2?Q?w_GET?=
=?ISO-8859-2?Q?[psql]_Polskie_t=B3umaczenie_?= =?ISO-8859-2?Q?licencji_BSD_dla_PostgreSQL=3F?=
polski nowy klip. realizacja Fotki i montaż: Rymek Błaszczak. animki fx i CC: mariusz mario zdanowski
VFP 8 i problem z polskimi znakami przy otwieraniu dbf-a z dosowego Fox-a
=?ISO-8859-2?Q?[firebird]_gdzie_si=EA_podzia=B3y_polskie_literki?=
=?iso-8859-2?q?mysql_+_polskie_znaczki_+_brak_pomys=B3=F3w?=
Zapis polskich literek w bazie danych US7ASCII z bazy EE8ISO8859P2
hurtowa zmiana polskich liter w nazwach =?ISO-8859-2?Q?plik=F3w_?=
[MySQL] - konwersja polskich znaków i jeszcze małe "conieco"
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|