Я работаю над приложением для своего телефона Android, поэтому я могу импортировать sms, читать их и отвечать на sms. Все работало так, как я планировал, когда я программировал сервер и клиент. Если у меня были проблемы, поиск Google дал мне решения, но на этот раз, в первый раз в моей жизни, я прошу вас о помощи.Как я могу отправить строку Java с символами Unicode на C++ через сокет, без странных символов?
Проблема:
Проблема заключается в том, когда клиент (Java) отправляет содержимое SMS, который содержит символы Юникода, такие как "а, а, ö", C++ не может читать их.
Моя программа работает с тем, что сначала отправляет размер пакета, чтобы другой знал о том, насколько большой будет пакет. Так, например, Java рассчитывает, что пакет будет равен 121 байт и отправит его на сервер. Но если пакет содержит несколько символов, отличных от ANSI, C++ не получит 121 байт, а 123 байта, а символы, отличные от ANSI, станут странными.
Я весь день пробовал без ответов. Я пробовал wchar_t в C++, я попытался настроить все на Java, которое будет отправлено с использованием UTF-8, я отлаживал часами, чтобы воссоздать проблему и попробовать разные вещи, но безуспешно!
Так что же здесь происходит? Как я могу получить текст с Java на C++ в правильном размере и представлении, как в Java? Пакеты без символов Unicode отлично работают.
Спасибо, ребята! Немного усталый атм, надеюсь, что я ничего не пропустил. Код может быть немного грязным, это пока еще прототип.
P: S, Это TCP-соединение.
-Server C++ RECV FUNCTION-
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;
}
- клиент Java Функция отправки -
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);
}
}
Вероятно, основная причина вашего замешательства: Гнезда не посылают символы, они посылают байты. – immibis
Я знаю, что они не отправляют символы, но перед отправкой они преобразуются в сырые байты. Я не вижу вашу точку зрения, – Ediz
Вы отправляете 'размер', не соответствует фактическому количеству отправляемых байтов.«Размер» выражается в терминах символов UTF-16, но «сообщение» отправляется вместо UTF-8. Они кодируют не-ASCII-символы по-разному, поэтому вам нужно преобразовать 'сообщение' в UTF-8 перед отправкой его длины. –