[JAVA] Lorsque la chaîne de caractères transmise au C ++ par JNA est déformée

Étude de cas

Lorsque vous passez le type Java String à C ++ avec JNA, s'il est reçu en tant que type Char * et affecté au type std: string, il sera brouillé.

Problème de code de caractère

Il semble que ** UTF-16 ** soit utilisé en Java, et il semble que ** Shift-JIS ** était cette fois-ci requis dans mon environnement C ++.

En C ++, il semble que le code de caractère qui peut être manipulé par chaque type change en fonction de l'environnement. Merci @yumetodo.

Je suppose que la conversion ne fonctionnait pas et j'ai eu une erreur.

Solution

J'ai cité une partie du code ici. 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 pour décaler-Convertir en JIS*/
  strShiftJis = utf8_to_multi_cppapi(strUtf);
  /*S'il vous plaît comme à partir d'ici*/
}

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);
}

Conclusion

Je suis content d'avoir appris les codes de caractères.

Les références

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

Lorsque la chaîne de caractères transmise au C ++ par JNA est déformée
Je veux savoir si la chaîne de caractères spécifiée est prise en charge par le code de caractère cible
[Swift] Copie la chaîne de caractères dans le presse-papiers
Quand le survol d'Eclipse est difficile à voir
[Java] Lors de la mise d'une chaîne de caractères dans le cas de l'instruction switch, il est nécessaire d'en faire une expression constante
[Java] Comment découper une chaîne de caractères caractère par caractère
[Kotlin] Convertit ZonedDateTime en chaîne en spécifiant le format
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
% rails db: Lorsque vous créez, le LoadError causé par mimemagic est
Changer un seul caractère de la chaîne de type String en majuscule
Un programme qui recherche une chaîne de caractères, et lorsque la chaîne de caractères de recherche est trouvée, affiche la chaîne de caractères du début de la ligne juste avant la chaîne de caractères de recherche.
Lorsque SimpleDateFormat est déformé comme ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧
Patch Monkey pour renvoyer l'heure actuelle lorsqu'une chaîne vide est spécifiée dans Time.parse de Ruby
[Java débutant] Conversion d'une chaîne de caractères en valeur numérique - Quelle est la méthode parseInt de la classe Integer? ~
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
Mesures contre l'oubli de spécifier la police lorsque titleTextAttributes est spécifié
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
Lorsque le traitement après le branchement conditionnel est redondant-12 [C # Refactoring Sample]
[Rails] Comment omettre l'affichage de la chaîne de caractères de la méthode link_to
[IOS] Que faire lorsque l'image est remplie d'une seule couleur
Que faire lorsque le préfixe c n'est pas lié dans JSP
Appelle la chaîne de caractères passée comme argument en tant que méthode avec send
[Docker] Comment créer lorsque le code source est monté en liaison sur le conteneur
[Petite histoire Java] Surveiller lorsqu'une valeur est ajoutée à la liste
[Java] Vérifiez si la chaîne de caractères est composée uniquement de blancs (= Vierge)
<Java> Quiz pour convertir par lots les noms de fichiers séparés par une chaîne de caractères spécifique avec une partie du nom de fichier