diff --git a/constraints/constraint_alphanumeric.inc b/constraints/constraint_alphanumeric.inc
index 88b434b..4aebc5c 100644
--- a/constraints/constraint_alphanumeric.inc
+++ b/constraints/constraint_alphanumeric.inc
@@ -25,10 +25,10 @@ function password_policy_constraint_alphanumeric_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_alphanumeric_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = password_policy_unicode_str_to_array($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_alnum($password[$i]))
+  foreach ($chars as $key => $char) {
+    if (ctype_alnum($char))
       $num++;
   }
   return $num >= $constraint;
diff --git a/constraints/constraint_complexity.inc b/constraints/constraint_complexity.inc
index 69290ce..a288f18 100644
--- a/constraints/constraint_complexity.inc
+++ b/constraints/constraint_complexity.inc
@@ -25,23 +25,23 @@ function password_policy_constraint_complexity_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_complexity_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = password_policy_unicode_str_to_array($password);
   $num = 0;
   $upper = 0;
   $lower = 0;
   $digit = 0;
   $punct = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_upper($password[$i])) {
+  foreach ($chars as $key => $char) {
+    if (ctype_upper($char)) {
       $upper = 1;
     }
-    elseif (ctype_lower($password[$i])) {
+    elseif (ctype_lower($char)) {
       $lower = 1;
     }
-    elseif (ctype_digit($password[$i])) {
+    elseif (ctype_digit($char)) {
       $digit = 1;
     }
-    elseif (ctype_punct($password[$i])) {
+    elseif (ctype_punct($char)) {
       $punct = 1;
     }
   }
diff --git a/constraints/constraint_digit.inc b/constraints/constraint_digit.inc
index 452808a..a51201b 100644
--- a/constraints/constraint_digit.inc
+++ b/constraints/constraint_digit.inc
@@ -25,10 +25,10 @@ function password_policy_constraint_digit_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_digit_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = password_policy_unicode_str_to_array($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_digit($password[$i]))
+   foreach ($chars as $key => $char) {
+    if (ctype_digit($char))
       $num++;
   }
   return $num >= $constraint;
diff --git a/constraints/constraint_letter.inc b/constraints/constraint_letter.inc
index 16ca916..c955297 100644
--- a/constraints/constraint_letter.inc
+++ b/constraints/constraint_letter.inc
@@ -25,10 +25,10 @@ function password_policy_constraint_letter_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_letter_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = password_policy_unicode_str_to_array($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_alpha($password[$i]))
+  foreach ($chars as $key => $char) {
+    if (ctype_alpha($char))
       $num++;
   }
   return $num >= $constraint;
diff --git a/constraints/constraint_lowercase.inc b/constraints/constraint_lowercase.inc
index 3e357d2..c672a4d 100644
--- a/constraints/constraint_lowercase.inc
+++ b/constraints/constraint_lowercase.inc
@@ -25,10 +25,10 @@ function password_policy_constraint_lowercase_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_lowercase_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = password_policy_unicode_str_to_array($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_lower($password[$i]))
+  foreach ($chars as $key => $char) {
+    if (ctype_lower($char))
       $num++;
   }
   return $num >= $constraint;
diff --git a/constraints/constraint_punctuation.inc b/constraints/constraint_punctuation.inc
index a2cbef0..1a8bc48 100644
--- a/constraints/constraint_punctuation.inc
+++ b/constraints/constraint_punctuation.inc
@@ -25,10 +25,10 @@ function password_policy_constraint_punctuation_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_punctuation_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = password_policy_unicode_str_to_array($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_punct($password[$i]))
+  foreach ($chars as $key => $char) {
+    if (ctype_punct($char))
       $num++;
   }
   return $num >= $constraint;
diff --git a/constraints/constraint_uppercase.inc b/constraints/constraint_uppercase.inc
index 070f68f..a23085f 100644
--- a/constraints/constraint_uppercase.inc
+++ b/constraints/constraint_uppercase.inc
@@ -25,10 +25,10 @@ function password_policy_constraint_uppercase_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_uppercase_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = password_policy_unicode_str_to_array($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_upper($password[$i]))
+  foreach ($chars as $key => $char) {
+    if (ctype_upper($char))
       $num++;
   }
   return $num >= $constraint;
diff --git a/password_policy.module b/password_policy.module
index 978aace..fa1ee35 100644
--- a/password_policy.module
+++ b/password_policy.module
@@ -1077,3 +1077,20 @@ function password_policy_add_policy_js($policy, $uid) {
     'setting');
 }
 
+/**
+ * Splits a string contain unicode characters into an array of specified length
+ *
+ * @param $string
+ *   The string that will be split
+ * @param $split_length
+ *   The chunk size, default = 1
+ * @return
+ *   A numeric array that has for values each string character
+ */
+function password_policy_unicode_str_to_array($string, $split_length=1) {
+  preg_match_all('`.`u', $string, $arr);
+  $arr = array_chunk($arr[0], $split_length);
+  $arr = array_map('implode', $arr);
+  return $arr;
+}
+
