İnt'lerin akışını java'da karakterlere dönüştürme


114

Bu muhtemelen başka bir yerde yanıtlanmıştır ama int değerinin karakter değerini nasıl elde edersiniz?

Özellikle bir tcp akışından bir okuyorum ve okuyucuların .read () yöntemi bir int döndürüyor.

Bundan nasıl bir karakter alabilirim?


1
Hangi verileri gönderdiğiniz ve okuduğunuz konusunda ayrıntılı bilgi vermediniz. İkili bayt mı yoksa Unicode karakter mi gönderiyorsunuz? Readers .read () yöntemi bir int döndürür. Evet, ancak okunan karakteri 0 ile 65535 arasında bir tamsayı olarak döndürüyor (veya -1, çünkü char yerine int kullanıldığını düşünüyorum). Belki sadece kullanmak public int read(char[] cbuf)sorunu çözecektir?
Vanuan

Bu sorunun cevapları JSP Java için geçerli değildir. Jsp kullanıyorsanız, şu yığın taşması hatasını görün: stackoverflow.com/questions/4621836/…
NuclearPeon

Bunun geçerli bir soru olduğunu düşünüyorum. Bir tamsayıyı bir karaktere dönüştürmenin zorluklarından biri, negatif değerler ve> = 255 değerleriyle uğraşmaktır.
bvdb

Bir bayt dizisindeki bir baytı bir karaktere dönüştürmek ve sonra bunu konsola yazdırmak istersem ne olur?
Doug Hauf

Yanıtlar:


74

Bir akışı metne dönüştürmeye çalışıyorsanız, hangi kodlamayı kullanmak istediğinizi bilmeniz gerekir. Daha sonra yapıcıya bir bayt dizisi geçirebilir Stringve bir Charsetveya kullanabilirsinizInputStreamReaderCharset bunun yerine uygun .

Basitçe yayın yapmak intiçinchar çevirme işlemi yalnızca ISO-8859-1 istiyorsanız, doğrudan bir akıştan bayt okuyorsanız çalışır.

DÜZENLEME: Eğer varsa vardır zaten kullanılarak Readerardından dönüş değeri döküm, read()için char(öyle -1 olup olmadığını kontrol ettikten sonra) gitmek için doğru yolu ... ama normalde daha verimli ve kullanışlı aramaya read(char[], int, int)bütün bir bloğu okumak bir seferde metin. Kaç karakterin okunduğunu görmek için dönüş değerini kontrol etmeyi unutmayın.


2
Bence OP'nin sorduğu bu değil. Okuyucunun okuma yöntemini kullanıyor: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () Sorduğu soru, bu yöntemle döndürülen değerin char'a nasıl dönüştürüleceği. .
Vanuan

3
Reader'ı gerçekten kullanıyorsa, bu kesinlikle bir fark yaratır. Aynı cümle içinde bir akıştan ve bir okuyucudan (küçük harf r ile) bahsettiği için net değil :( Bunu açıklığa kavuşturmak için cevabımı düzenledim.
Jon Skeet,

javadoc docs.oracle.com/javase/8/docs/api/java/io/…InputStreamReaderBufferedReader
bvdb

Neden "int'den karaktere geçiş yalnızca ISO-8859-1 istiyorsanız işe yarar"? Bunun nedeni Java'nın dahili olarak UTF-16 kullanması ve tüm ISO-8859-1 karakterlerinin UTF-16'da aynı kod birimini (bit) tutması mı?
Sébastien

@Sebastien: Evet, temelde bu kadar.
Jon Skeet

144

Belki soruyorsun:

Character.toChars(65) // returns ['A']

Daha fazla bilgi: Character.toChars(int codePoint)

Belirtilen karakteri (Unicode kod noktası) bir char dizisinde depolanan UTF-16 gösterimine dönüştürür. Belirtilen kod noktası bir BMP (Temel Çok Dilli Düzlem veya Düzlem 0) değeriyse, ortaya çıkan char dizisi, codePoint ile aynı değere sahiptir. Belirtilen kod noktası tamamlayıcı bir kod noktasıysa, ortaya çıkan karakter dizisi karşılık gelen vekil çiftine sahiptir.


9
Bu yalnızca söz konusu tamsayı zaten bir UTF-16 kod noktasıysa geçerlidir. Durumun bu olup olmadığı hakkında hiçbir fikrimiz yok.
Jon Skeet

2
@Atec: Hayır, demek istediğim, eğer bir akıştan sadece bayt okuyorsa (net değil) o zaman sadece yayınlayarak veya kullanarak dönüştürmenin toCharsgenellikle uygunsuz olduğu. Okuyucudan okuyorsa, sorun değil.
Jon Skeet

2
Kuşkusuz soru bunu belirtmemiş olsa da, bu soru ASCII kod noktalarını karakterlere dönüştürmek için bir Google aramasının ilk sonucu olarak ortaya çıkıyor, bu yüzden onu yükseltiyorum.
ArtOfWarfare

105

Bu, "int'i karaktere dönüştürmek" ile ne demek istediğinize bağlıdır.

Yalnızca int içindeki değeri çevirmek istiyorsanız, bunu Java'nın typecast gösterimini kullanarak çevirebilirsiniz:

int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'

1 tamsayısını '1' karakterine dönüştürmeyi kastediyorsanız, bunu şu şekilde yapabilirsiniz:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}

Ya Char'dan Tamsayı'ya geçseydiniz? Integer.parseInt (c)?
Breedly

Bu cevap TEK :-)
voghDev

29

İnt 5'i char '5'e dönüştürmek istiyorsanız: (Yalnızca 0-9 tam sayıları için)

int i = 5;
char c = (char) ('0' + i); // c is now '5';

Hayır .. '0' + 5, '05' dizesi olur. Sağ taraf (char) ((int) '0') + i olmalıdır;
Toddkaufmann

Java'da karakterler Dizelere dönüştürülmediğinden doğru değildir.
Kaushik Shankar

+1 - denendi ve test edildi, işe yarıyor! Kendiniz deneyin ve deneyin, görünüşe göre buradaki yorumcuların aksine ...
Ian Campbell

8

Basit döküm:

int a = 99;
char c = (char) a;

Bunun sizin için çalışmamasının herhangi bir nedeni var mı?


1
Metin akışı saf ASCII değilse tehlikeli tavsiye. Yukarıdaki Jon Skeet'in cevabına bakın.
sleske

1
Çalışmayabilir. Ama aslında olacağını düşünüyorum. Char veri türü UTF-16 kodlu değeri depolar. Bu nedenle, char'ı int'e dönüştürmek için bazı dönüşümler yapmanız gerekir. Ancak OP zaten UTF-16 kodlu değeri döndüren read () yöntemini kullandığından, basit döküm işe yarayacaktır. Yanılıyorsam düzeltin.
Vanuan

Üzgünüm, "
int'ten

bu sayılara değil, beklenmedik kodlama değerlerine neden olur
Vasil Valchev

4

Bu çözüm Tamsayı uzunluk boyutu = 1 için çalışır.

Integer input = 9; Character.valueOf((char) input.toString().charAt(0))

boyut> 1 ise döngü için kullanmalı ve baştan sona yinelemeliyiz.


1

Buradaki yanıtların çoğu, ne yaptığınız hakkında hiçbir fikriniz yoksa size büyük sorunlara yol açabilecek kısayollar önerir. Kısayol kullanmak istiyorsanız, verilerinizin tam olarak hangi kodlamada olduğunu bilmeniz gerekir.

UTF-16

Java, belgelerinde karakterlerden bahsettiğinde, 16 bitlik karakterlerden bahsediyor.

DataInputStreamUygun yöntemlere sahip olan a kullanabilirsiniz . Verimlilik için, bir BufferedReader.

// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast

Mesele şu ki, her biri readChar()aslında 2'leri gerçekleştirecek readve bunları 16 bitlik bir karakterde birleştirecek.

US-ASCII

US-ASCII, 1 karakteri kodlamak için 8 bit ayırır. ASCII tablosu yalnızca 128 olası karakteri açıklar, bu nedenle 1 bit her zaman kullanılmaz.

Bu durumda basitçe bir döküm gerçekleştirebilirsiniz.

int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;

Genişletilmiş ASCII

UTF-8, Latin-1, ANSI ve diğer birçok kodlama, tüm 8 biti kullanır. İlk 7 bit ASCII tablosunu takip eder ve US-ASCII kodlamasınınkilerle aynıdır. Ancak 8. bit, tüm bu kodlamalarda farklı olan karakterler sunar. Yani burada işler ilginçleşiyor.

Kovboy isen ve 8. bitin önemli olmadığını düşünüyorsan (yani "à, é, ç, è, ô ... gibi karakterleri umursamıyorsun) o zaman basit bir alçı ile kurtulabilirsin.

Ancak, bunu profesyonel bir şekilde yapmak istiyorsanız, gerçekten HER ZAMAN metni içeri / dışarı aktardığınızda (örneğin soketler, dosyalar ...) bir karakter seti belirlemelisiniz.

Her zaman karakter kümelerini kullan

Hadi ciddileşelim. Yukarıdaki tüm seçenekler ucuz numaralardır. Esnek bir yazılım yazmak istiyorsanız, verilerinizi içe / dışa aktarmak için yapılandırılabilir bir karakter kümesini desteklemeniz gerekir. İşte genel bir çözüm:

Bir byte[]arabellek kullanarak verilerinizi okuyun ve bunu String bir karakter kümesi parametresi kullanarak dönüştürmek için .

byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);

InputStreamReaderBir karakter kümesi parametresi ile somutlaştırılabilen bir de kullanabilirsiniz .

Sadece bir altın kural daha: Bir karaktere doğrudan bir bayt atmayın. Bu her zaman bir hatadır.


1

Kullanıcı sadece literaaly bir dönüştürmek istediğini varsayımına cevabım oturtmakta intiçin charörneğin,

Input: 
int i = 5; 
Output:
char c = '5'

Bu zaten yukarıda cevaplanmıştır, ancak tamsayı değeri varsa i > 10, o zaman kullanılması gerekir char array.

char[] c = String.valueOf(i).toCharArray();

1
    int i = 7;
    char number = Integer.toString(i).charAt(0);
    System.out.println(number);

0

Bu tamamen gelen verilerin kodlanmasına bağlıdır.


bu işe yaramaz bir "cevap" gibi, olumsuz oy verirdim ama buna değmez bile.
Lpc_dark

@Lpc_dark Bu cevap, diğer cevapların% 90'ından daha doğru. Daha fazla ayrıntı için cevabıma bakın.
bvdb

0

belki de en hızlısı değil:

//for example there is an integer with the value of 5:
int i = 5;

//getting the char '5' out of it:
char c = String.format("%s",i).charAt(0); 

-2

Char'ın int veya long'a dönüştürülmesinin yanıtı basit dökümdür.

Örneğin: - Char '0'ı long'a dönüştürmek istiyorsanız.

Basit oyuncu kadrosunu takip edin

Char ch='0';
String convertedChar= Character.toString(ch);  //Convert Char to String.
Long finalLongValue=Long.parseLong(convertedChar);

Bitti !!


bu, tam olarak onun sorduğu şeyin tam tersi.
uzman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.