Je travaille sur une application pour mon téléphone android afin que je puisse importer des sms, les lire et répondre aux sms. Tout a fonctionné comme je l'avais prévu lors de la programmation du serveur et du client. Si j'avais des problèmes, la recherche Google m'a donné des solutions, mais cette fois-ci, pour la première fois de ma vie, je vous demande de l'aide.Comment puis-je envoyer une chaîne Java avec des caractères Unicode en C++ via socket, sans caractères étranges?
Le problème:
Le problème est, lorsque le client (Java) envoie le contenu SMS qui contient des caractères unicode tels que "å, ä, ö", C++ ne peut pas les lire.
Mon programme fonctionne qu'il envoie d'abord la taille de paquet pour rendre l'autre conscient de la taille du paquet qui viendra. Ainsi, par exemple, Java calcule que le paquet sera de 121 octets et l'envoie au serveur. Mais si le paquet contient peu de caractères non ANSI, C++ ne recevra pas 121 octets, mais 123 octets, et les caractères non-ANSI deviendront étranges.
J'ai été googling toute la journée sans réponses. J'ai essayé wchar_t en C++, j'ai essayé de tout mettre en Java pour l'envoyer en utilisant UTF-8, j'ai débogué pendant des heures pour recréer le problème et essayer différentes choses, mais sans succès!
Alors, que se passe-t-il ici? Comment puis-je obtenir le texte de Java en C++ dans la bonne taille et la représentation comme en Java? Les paquets sans caractères Unicode fonctionnent correctement.
Merci les gars! Un peu fatigué atm, j'espère que je n'ai rien manqué. Le code pourrait être un peu brouillon, ce n'est qu'un prototype pour le moment.
P: S, Ceci est une connexion TCP.
-Server C++ recv Fonction-
bool Receive(std::string& msg)
{
zReadMutex.lock();
try
{
int errCode;
unsigned int packetSize = 0;
char packetSizeBuffer[4];
//Get packet size
errCode = recv(zSocket, packetSizeBuffer, sizeof(packetSizeBuffer), 0);
if (errCode == SOCKET_ERROR || errCode == 0)
{
throw NetworkException("Failed Receiving Packet Size!", WSAGetLastError());
}
//Convert
packetSize = CharArrayToUnsignedInt(packetSizeBuffer);
if (packetSize == 0)
{
throw NetworkException("Connection Closed!");
}
//Calculate chunks
//Total bits received
unsigned int totalBits = 0;
//Calculate number of chunks that will arrive
int chunks = CaculateChunks(packetSize);
//Counter for the chunk loop
int count = 0;
//Add to message for every chunk received
std::string message = "";
//Just a temp check
if (chunks > 15)
{
throw NetworkException("Connection Closed!");
}
//Get Chunks
while (count < chunks)
{
char* buffer = new char[zMaxChunkSize];
if ((errCode = recv(zSocket, buffer, zMaxChunkSize, 0)) <= 0)
{
if (errCode < 0)
{
delete [] buffer;
throw NetworkException("Failed Receiving Packet Data!", WSAGetLastError());
}
else
{
delete [] buffer;
throw NetworkException("Connection Closed!");
}
}
totalBits += errCode;
count++;
message += buffer;
delete [] buffer;
}
if (packetSize != totalBits)
{
throw NetworkException("Message is not expected size!");
}
message.resize(totalBits);
msg = std::string(message);
}
catch(...)
{
zReadMutex.unlock();
throw;
}
zReadMutex.unlock();
return true;
}
- Client Java Envoyer Fonction -
public boolean InitSender()
{
if(mSocket == null)
return false;
try {
//Auto flush is false, but it auto flush anyways
out = new PrintStream(mSocket.getOutputStream(), false, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public synchronized void SendMessage(final String a)
{
int size = 0;
size = a.length();
//Send size
out.print(size);
//Chunk it
int chunks = CalculateChunks(a);
String[] data = SplitToChunks(a, chunks);
for (String message : data)
{
//Send data
out.print(message);
}
}
probablement la cause racine de votre confusion: Sockets ne pas envoyer des caractères, ils envoient octets. – immibis
Je sais qu'ils n'envoient pas de caractères, mais ils sont convertis en octets bruts avant d'être envoyés. Je ne vois pas vraiment ce que vous voulez dire, – Ediz
La 'taille' que vous envoyez ne correspond pas au nombre réel d'octets que vous envoyez.La 'size' est exprimée en termes de caractères UTF-16, mais le' message' est envoyé en UTF-8 à la place. Ils encodent différemment les caractères non-ASCII, vous devez donc convertir 'message' en UTF-8 avant d'envoyer sa longueur. –