net_string_util_icu_alternatives_android.cc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <string>
  5. #include "base/android/jni_android.h"
  6. #include "base/android/jni_string.h"
  7. #include "base/strings/string_piece.h"
  8. #include "net/base/net_string_util.h"
  9. #include "net/net_jni_headers/NetStringUtil_jni.h"
  10. using base::android::ScopedJavaLocalRef;
  11. namespace net {
  12. namespace {
  13. // Attempts to convert |text| encoded in |charset| to a jstring (Java unicode
  14. // string). Returns the result jstring, or NULL on failure.
  15. ScopedJavaLocalRef<jstring> ConvertToJstring(base::StringPiece text,
  16. const char* charset) {
  17. JNIEnv* env = base::android::AttachCurrentThread();
  18. ScopedJavaLocalRef<jobject> java_byte_buffer(
  19. env,
  20. env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()));
  21. base::android::CheckException(env);
  22. base::android::ScopedJavaLocalRef<jstring> java_charset =
  23. base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset));
  24. ScopedJavaLocalRef<jstring> java_result =
  25. android::Java_NetStringUtil_convertToUnicode(env, java_byte_buffer,
  26. java_charset);
  27. return java_result;
  28. }
  29. // Attempts to convert |text| encoded in |charset| to a jstring (Java unicode
  30. // string) and then normalizes the string. Returns the result jstring, or NULL
  31. // on failure.
  32. ScopedJavaLocalRef<jstring> ConvertToNormalizedJstring(base::StringPiece text,
  33. const char* charset) {
  34. JNIEnv* env = base::android::AttachCurrentThread();
  35. ScopedJavaLocalRef<jobject> java_byte_buffer(
  36. env,
  37. env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()));
  38. base::android::CheckException(env);
  39. base::android::ScopedJavaLocalRef<jstring> java_charset =
  40. base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset));
  41. ScopedJavaLocalRef<jstring> java_result =
  42. android::Java_NetStringUtil_convertToUnicodeAndNormalize(
  43. env, java_byte_buffer, java_charset);
  44. return java_result;
  45. }
  46. // Converts |text| encoded in |charset| to a jstring (Java unicode string).
  47. // Any characters that can not be converted are replaced with U+FFFD.
  48. ScopedJavaLocalRef<jstring> ConvertToJstringWithSubstitutions(
  49. base::StringPiece text,
  50. const char* charset) {
  51. JNIEnv* env = base::android::AttachCurrentThread();
  52. ScopedJavaLocalRef<jobject> java_byte_buffer(
  53. env,
  54. env->NewDirectByteBuffer(const_cast<char*>(text.data()), text.length()));
  55. base::android::CheckException(env);
  56. base::android::ScopedJavaLocalRef<jstring> java_charset =
  57. base::android::ConvertUTF8ToJavaString(env, base::StringPiece(charset));
  58. ScopedJavaLocalRef<jstring> java_result =
  59. android::Java_NetStringUtil_convertToUnicodeWithSubstitutions(
  60. env, java_byte_buffer, java_charset);
  61. return java_result;
  62. }
  63. } // namespace
  64. // This constant cannot be defined as const char[] because it is initialized
  65. // by base::kCodepageLatin1 (which is const char[]) in net_string_util_icu.cc.
  66. const char* const kCharsetLatin1 = "ISO-8859-1";
  67. bool ConvertToUtf8(base::StringPiece text,
  68. const char* charset,
  69. std::string* output) {
  70. output->clear();
  71. ScopedJavaLocalRef<jstring> java_result = ConvertToJstring(text, charset);
  72. if (java_result.is_null())
  73. return false;
  74. *output = base::android::ConvertJavaStringToUTF8(java_result);
  75. return true;
  76. }
  77. bool ConvertToUtf8AndNormalize(base::StringPiece text,
  78. const char* charset,
  79. std::string* output) {
  80. output->clear();
  81. ScopedJavaLocalRef<jstring> java_result = ConvertToNormalizedJstring(
  82. text, charset);
  83. if (java_result.is_null())
  84. return false;
  85. *output = base::android::ConvertJavaStringToUTF8(java_result);
  86. return true;
  87. }
  88. bool ConvertToUTF16(base::StringPiece text,
  89. const char* charset,
  90. std::u16string* output) {
  91. output->clear();
  92. ScopedJavaLocalRef<jstring> java_result = ConvertToJstring(text, charset);
  93. if (java_result.is_null())
  94. return false;
  95. *output = base::android::ConvertJavaStringToUTF16(java_result);
  96. return true;
  97. }
  98. bool ConvertToUTF16WithSubstitutions(base::StringPiece text,
  99. const char* charset,
  100. std::u16string* output) {
  101. output->clear();
  102. ScopedJavaLocalRef<jstring> java_result =
  103. ConvertToJstringWithSubstitutions(text, charset);
  104. if (java_result.is_null())
  105. return false;
  106. *output = base::android::ConvertJavaStringToUTF16(java_result);
  107. return true;
  108. }
  109. bool ToUpper(base::StringPiece16 str, std::u16string* output) {
  110. output->clear();
  111. JNIEnv* env = base::android::AttachCurrentThread();
  112. ScopedJavaLocalRef<jstring> java_new_str(
  113. env,
  114. env->NewString(reinterpret_cast<const jchar*>(str.data()), str.length()));
  115. if (java_new_str.is_null())
  116. return false;
  117. ScopedJavaLocalRef<jstring> java_result =
  118. android::Java_NetStringUtil_toUpperCase(env, java_new_str);
  119. if (java_result.is_null())
  120. return false;
  121. *output = base::android::ConvertJavaStringToUTF16(java_result);
  122. return true;
  123. }
  124. } // namespace net