diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index 609fe22..d50b833 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -500,8 +500,8 @@
       }
     } else {
       size_t i = CalculateEncodingDict(charset, pBaseDict);
-      if (i < pdfium::size(g_FX_CharsetUnicodes)) {
-        const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+      if (i < pdfium::size(kFX_CharsetUnicodes)) {
+        const uint16_t* pUnicodes = kFX_CharsetUnicodes[i].m_pUnicodes;
         for (int j = 0; j < 128; j++) {
           int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]);
           int char_width = pFont->GetGlyphWidth(glyph_index);
@@ -636,11 +636,11 @@
 size_t CPDF_DocPageData::CalculateEncodingDict(FX_Charset charset,
                                                CPDF_Dictionary* pBaseDict) {
   size_t i;
-  for (i = 0; i < pdfium::size(g_FX_CharsetUnicodes); ++i) {
-    if (g_FX_CharsetUnicodes[i].m_Charset == charset)
+  for (i = 0; i < pdfium::size(kFX_CharsetUnicodes); ++i) {
+    if (kFX_CharsetUnicodes[i].m_Charset == charset)
       break;
   }
-  if (i == pdfium::size(g_FX_CharsetUnicodes))
+  if (i == pdfium::size(kFX_CharsetUnicodes))
     return i;
 
   CPDF_Dictionary* pEncodingDict =
@@ -650,7 +650,7 @@
   CPDF_Array* pArray = pEncodingDict->SetNewFor<CPDF_Array>("Differences");
   pArray->AppendNew<CPDF_Number>(128);
 
-  const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+  const uint16_t* pUnicodes = kFX_CharsetUnicodes[i].m_pUnicodes;
   for (int j = 0; j < 128; j++) {
     ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
     pArray->AppendNew<CPDF_Name>(name.IsEmpty() ? ".notdef" : name);
diff --git a/core/fxcrt/fx_codepage.cpp b/core/fxcrt/fx_codepage.cpp
index e7f6eb5..b15e16f 100644
--- a/core/fxcrt/fx_codepage.cpp
+++ b/core/fxcrt/fx_codepage.cpp
@@ -18,7 +18,7 @@
 
 namespace {
 
-const uint16_t g_FX_MSDOSThaiUnicodes[128] = {
+const uint16_t kFX_MSDOSThaiUnicodes[128] = {
     0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x0000, 0x0000,
@@ -36,7 +36,7 @@
     0x0000, 0x0000,
 };
 
-const uint16_t g_FX_MSWinEasternEuropeanUnicodes[128] = {
+const uint16_t kFX_MSWinEasternEuropeanUnicodes[128] = {
     0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000,
     0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, 0x0000, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161,
@@ -54,7 +54,7 @@
     0x0163, 0x02D9,
 };
 
-const uint16_t g_FX_MSWinCyrillicUnicodes[128] = {
+const uint16_t kFX_MSWinCyrillicUnicodes[128] = {
     0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC,
     0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459,
@@ -72,7 +72,7 @@
     0x044E, 0x044F,
 };
 
-const uint16_t g_FX_MSWinGreekUnicodes[128] = {
+const uint16_t kFX_MSWinGreekUnicodes[128] = {
     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000,
     0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000,
@@ -90,7 +90,7 @@
     0x03CE, 0x0000,
 };
 
-const uint16_t g_FX_MSWinTurkishUnicodes[128] = {
+const uint16_t kFX_MSWinTurkishUnicodes[128] = {
     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6,
     0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161,
@@ -108,7 +108,7 @@
     0x015F, 0x00FF,
 };
 
-const uint16_t g_FX_MSWinHebrewUnicodes[128] = {
+const uint16_t kFX_MSWinHebrewUnicodes[128] = {
     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6,
     0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000,
@@ -126,7 +126,7 @@
     0x200F, 0x0000,
 };
 
-const uint16_t g_FX_MSWinArabicUnicodes[128] = {
+const uint16_t kFX_MSWinArabicUnicodes[128] = {
     0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6,
     0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06AF, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691,
@@ -144,7 +144,7 @@
     0x200F, 0x06D2,
 };
 
-const uint16_t g_FX_MSWinBalticUnicodes[128] = {
+const uint16_t kFX_MSWinBalticUnicodes[128] = {
     0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000,
     0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, 0x0000, 0x2018,
     0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000,
@@ -167,7 +167,7 @@
   FX_CodePage codepage;
 };
 
-const FX_CHARSET_MAP g_FXCharset2CodePageTable[] = {
+const FX_CHARSET_MAP kFXCharset2CodePageTable[] = {
     {FX_Charset::kANSI, FX_CodePage::kMSWin_WesternEuropean},
     {FX_Charset::kDefault, FX_CodePage::kDefANSI},
     {FX_Charset::kSymbol, FX_CodePage::kSymbol},
@@ -203,15 +203,15 @@
 
 }  // namespace
 
-const FX_CharsetUnicodes g_FX_CharsetUnicodes[8] = {
-    {FX_Charset::kThai, g_FX_MSDOSThaiUnicodes},
-    {FX_Charset::kMSWin_EasternEuropean, g_FX_MSWinEasternEuropeanUnicodes},
-    {FX_Charset::kMSWin_Cyrillic, g_FX_MSWinCyrillicUnicodes},
-    {FX_Charset::kMSWin_Greek, g_FX_MSWinGreekUnicodes},
-    {FX_Charset::kMSWin_Turkish, g_FX_MSWinTurkishUnicodes},
-    {FX_Charset::kMSWin_Hebrew, g_FX_MSWinHebrewUnicodes},
-    {FX_Charset::kMSWin_Arabic, g_FX_MSWinArabicUnicodes},
-    {FX_Charset::kMSWin_Baltic, g_FX_MSWinBalticUnicodes},
+const FX_CharsetUnicodes kFX_CharsetUnicodes[8] = {
+    {FX_Charset::kThai, kFX_MSDOSThaiUnicodes},
+    {FX_Charset::kMSWin_EasternEuropean, kFX_MSWinEasternEuropeanUnicodes},
+    {FX_Charset::kMSWin_Cyrillic, kFX_MSWinCyrillicUnicodes},
+    {FX_Charset::kMSWin_Greek, kFX_MSWinGreekUnicodes},
+    {FX_Charset::kMSWin_Turkish, kFX_MSWinTurkishUnicodes},
+    {FX_Charset::kMSWin_Hebrew, kFX_MSWinHebrewUnicodes},
+    {FX_Charset::kMSWin_Arabic, kFX_MSWinArabicUnicodes},
+    {FX_Charset::kMSWin_Baltic, kFX_MSWinBalticUnicodes},
 };
 
 FX_CodePage FX_GetACP() {
@@ -224,12 +224,11 @@
 
 FX_CodePage FX_GetCodePageFromCharset(FX_Charset charset) {
   auto* result = std::lower_bound(
-      std::begin(g_FXCharset2CodePageTable),
-      std::end(g_FXCharset2CodePageTable), charset,
-      [](const FX_CHARSET_MAP& iter, const FX_Charset& charset) {
+      std::begin(kFXCharset2CodePageTable), std::end(kFXCharset2CodePageTable),
+      charset, [](const FX_CHARSET_MAP& iter, const FX_Charset& charset) {
         return iter.charset < charset;
       });
-  if (result != std::end(g_FXCharset2CodePageTable) &&
+  if (result != std::end(kFXCharset2CodePageTable) &&
       result->charset == charset) {
     return result->codepage;
   }
@@ -237,7 +236,7 @@
 }
 
 FX_Charset FX_GetCharsetFromCodePage(FX_CodePage codepage) {
-  for (const auto& it : g_FXCharset2CodePageTable) {
+  for (const auto& it : kFXCharset2CodePageTable) {
     if (it.codepage == codepage)
       return it.charset;
   }
diff --git a/core/fxcrt/fx_codepage.h b/core/fxcrt/fx_codepage.h
index 265587e..56b5591 100644
--- a/core/fxcrt/fx_codepage.h
+++ b/core/fxcrt/fx_codepage.h
@@ -104,7 +104,7 @@
   const uint16_t* m_pUnicodes;  // Raw, POD struct.
 };
 
-extern const FX_CharsetUnicodes g_FX_CharsetUnicodes[8];
+extern const FX_CharsetUnicodes kFX_CharsetUnicodes[8];
 
 FX_CodePage FX_GetACP();
 FX_CodePage FX_GetCodePageFromCharset(FX_Charset charset);
