Issue #1813: Fix codec lookup and setting/getting locales under Turkish locales.
diff --git a/Lib/locale.py b/Lib/locale.py
index bb4aa37..166538d 100644
--- a/Lib/locale.py
+++ b/Lib/locale.py
@@ -331,6 +331,13 @@
 # overridden below)
 _setlocale = setlocale
 
+# Avoid relying on the locale-dependent .lower() method
+# (see issue #1813).
+_ascii_lower_map = ''.join(
+    chr(x + 32 if x >= ord('A') and x <= ord('Z') else x)
+    for x in range(256)
+)
+
 def normalize(localename):
 
     """ Returns a normalized locale code for the given locale
@@ -348,7 +355,7 @@
 
     """
     # Normalize the locale name and extract the encoding
-    fullname = localename.lower()
+    fullname = localename.translate(_ascii_lower_map)
     if ':' in fullname:
         # ':' is sometimes used as encoding delimiter.
         fullname = fullname.replace(':', '.')
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index f7f27cc..d434f83 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -1,6 +1,7 @@
 from test import test_support
 import unittest
 import codecs
+import locale
 import sys, StringIO, _testcapi
 
 class Queue(object):
@@ -1153,6 +1154,19 @@
         self.assertRaises(TypeError, codecs.getwriter)
         self.assertRaises(LookupError, codecs.getwriter, "__spam__")
 
+    def test_lookup_issue1813(self):
+        # Issue #1813: under Turkish locales, lookup of some codecs failed
+        # because 'I' is lowercased as a dotless "i"
+        oldlocale = locale.getlocale(locale.LC_CTYPE)
+        self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale)
+        try:
+            locale.setlocale(locale.LC_CTYPE, 'tr_TR')
+        except locale.Error:
+            # Unsupported locale on this system
+            self.skipTest('test needs Turkish locale')
+        c = codecs.lookup('ASCII')
+        self.assertEqual(c.name, 'ascii')
+
 class StreamReaderTest(unittest.TestCase):
 
     def setUp(self):
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
index 8bb99cb..f3330d0 100644
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -396,6 +396,19 @@
         # crasher from bug #7419
         self.assertRaises(locale.Error, locale.setlocale, 12345)
 
+    def test_getsetlocale_issue1813(self):
+        # Issue #1813: setting and getting the locale under a Turkish locale
+        oldlocale = locale.getlocale()
+        self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale)
+        try:
+            locale.setlocale(locale.LC_CTYPE, 'tr_TR')
+        except locale.Error:
+            # Unsupported locale on this system
+            self.skipTest('test needs Turkish locale')
+        loc = locale.getlocale()
+        locale.setlocale(locale.LC_CTYPE, loc)
+        self.assertEqual(loc, locale.getlocale())
+
 
 def test_main():
     tests = [
diff --git a/Misc/NEWS b/Misc/NEWS
index 2ad6f63..8ee7221 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -37,6 +37,9 @@
 Library
 -------
 
+- Issue #1813: Fix codec lookup and setting/getting locales under Turkish
+  locales.
+
 - Issue #10883: Fix socket leaks in urllib when using FTP.
 
 - Issue #12592: Make Python build on OpenBSD 5 (and future major releases).
diff --git a/Python/codecs.c b/Python/codecs.c
index 57bd0f4..7334eb3 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -70,7 +70,7 @@
         if (ch == ' ')
             ch = '-';
         else
-            ch = tolower(Py_CHARMASK(ch));
+            ch = Py_TOLOWER(Py_CHARMASK(ch));
         p[i] = ch;
     }
     return v;