[JAVA] Wenn die von JNA an C ++ übergebene Zeichenfolge verstümmelt ist

Fallstudie

Wenn Sie den Java-Zeichenfolgentyp mit JNA an C ++ übergeben und als Char * -Typ empfangen und dem Standardtyp std: string zugewiesen werden, wird er verstümmelt.

Zeichencode-Problem

Anscheinend wird ** UTF-16 ** in Java verwendet, und diesmal war ** Shift-JIS ** in meiner C ++ - Umgebung erforderlich.

In C ++ scheint sich der Zeichencode, der von jedem Typ verarbeitet werden kann, je nach Umgebung zu ändern. Danke @yumetodo.

Ich vermute, dass die Konvertierung nicht funktioniert hat und ich einen Fehler erhalten habe.

Lösung

Ich habe hier einen Teil des Codes zitiert. http://nekko1119.hatenablog.com/entry/2017/01/02/054629

use.cpp


#include <iostream>
#include <string>
#include <codecvt>
#include <cassert>
#include <locale>

void useString(char* str){
  std:string strUtf;
  strUtf = str;
  /* uft-8 zu verschieben-In JIS konvertieren*/
  strShiftJis = utf8_to_multi_cppapi(strUtf);
  /*Bitte wie von hier an*/
}

std::string utf8_to_multi_cppapi(std::string const& src)
{
  auto const wide = utf8_to_wide_cppapi(src);
  return wide_to_multi_capi(wide);
}

std::string wide_to_multi_capi(std::wstring const& src)
{
  std::size_t converted{};
  std::vector<char> dest(src.size() * sizeof(wchar_t) + 1, '\0');
  if (::_wcstombs_s_l(&converted, dest.data(), dest.size(), src.data(), _TRUNCATE, ::_create_locale(LC_ALL, "jpn")) != 0) {
    throw std::system_error{ errno, std::system_category() };
  }
  return std::string(dest.begin(), dest.end());
}

std::wstring utf8_to_wide_cppapi(std::string const& src)
{
  std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
  return converter.from_bytes(src);
}

Fazit

Ich bin froh, dass ich etwas über Zeichencodes gelernt habe.

Verweise

http://marupeke296.com/CPP_charUnicodeWideChar.html http://nekko1119.hatenablog.com/entry/2017/01/02/054629 https://cpprefjp.github.io/reference/codecvt/codecvt_utf8_utf16.html https://theolizer.com/cpp-school1/cpp-school1-18/

Recommended Posts

Wenn die von JNA an C ++ übergebene Zeichenfolge verstümmelt ist
Ich möchte herausfinden, ob die angegebene Zeichenfolge vom Zielzeichencode unterstützt wird
[Swift] Kopieren Sie die Zeichenfolge in die Zwischenablage
Wenn der Schwebeflug von Eclipse schwer zu sehen ist
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen
[Java] So schneiden Sie eine Zeichenfolge zeichenweise aus
[Kotlin] Konvertieren Sie ZonedDateTime in String, indem Sie das Format angeben
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
% Rails DB: Beim Erstellen ist der durch Mimemagic verursachte LoadError
Ändern Sie nur ein Zeichen vom String vom Typ String in Großbuchstaben
Ein Programm, das nach einer Zeichenfolge sucht und die Suchzeichenfolge gefunden hat, zeigt die Zeichenfolge vom Zeilenanfang bis kurz vor der Suchzeichenfolge an.
Wenn SimpleDateFormat wie ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧ verstümmelt ist
Affen-Patch, um die aktuelle Zeit zurückzugeben, wenn in Time.parse of Ruby eine leere Zeichenfolge angegeben ist
[Java-Anfänger] Konvertierung von Zeichenfolge in numerischen Wert - Was ist die parseInt-Methode der Integer-Klasse? ~
Auf Anforderung wird der Zugriff auf die Ressource beim Push mit Docker verweigert
Maßnahmen gegen das Vergessen, die Schriftart anzugeben, wenn titleTextAttributes angegeben wird
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Wenn die Verarbeitung nach der bedingten Verzweigung redundant ist-12 [C # Refactoring Sample]
[Rails] So lassen Sie die Anzeige der Zeichenfolge der link_to-Methode weg
[IOS] Was tun, wenn das Bild mit einer Farbe gefüllt ist?
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
Ruft die als Argument übergebene Zeichenfolge als Methode mit send auf
[Docker] Erstellen, wenn der Quellcode auf dem Container gebunden ist
[Java small story] Überwachen Sie, wann der Liste ein Wert hinzugefügt wird
[Java] Überprüfen Sie, ob die Zeichenfolge nur aus Leerzeichen besteht (= Leerzeichen)
<Java> Quiz zum Batch-Konvertieren von Dateinamen, die durch eine bestimmte Zeichenfolge mit einem Teil des Dateinamens getrennt sind