diff --git a/constraints/constraint_alphanumeric.inc b/constraints/constraint_alphanumeric.inc
index 88b434b..cb8d40b 100644
--- a/constraints/constraint_alphanumeric.inc
+++ b/constraints/constraint_alphanumeric.inc
@@ -25,11 +25,12 @@ function password_policy_constraint_alphanumeric_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_alphanumeric_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = drupal_strlen($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_alnum($password[$i]))
+  for ($i = 0; $i < $chars; ++$i) {
+    if (ctype_alnum(drupal_substr($password, $i, 1))) {
       $num++;
+    }
   }
   return $num >= $constraint;
 }
diff --git a/constraints/constraint_complexity.inc b/constraints/constraint_complexity.inc
index 69290ce..54425b9 100644
--- a/constraints/constraint_complexity.inc
+++ b/constraints/constraint_complexity.inc
@@ -25,23 +25,24 @@ function password_policy_constraint_complexity_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_complexity_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = drupal_strlen($password);
   $num = 0;
   $upper = 0;
   $lower = 0;
   $digit = 0;
   $punct = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_upper($password[$i])) {
+  for ($i = 0; $i < $chars; ++$i) {
+    $char = drupal_substr($password, $i, 1);
+    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..abc26ff 100644
--- a/constraints/constraint_digit.inc
+++ b/constraints/constraint_digit.inc
@@ -25,11 +25,12 @@ function password_policy_constraint_digit_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_digit_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = drupal_strlen($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_digit($password[$i]))
+  for ($i = 0; $i < $chars; ++$i) {
+    if (ctype_digit(drupal_substr($password, $i, 1))) {
       $num++;
+    }
   }
   return $num >= $constraint;
 }
diff --git a/constraints/constraint_digit_placement.inc b/constraints/constraint_digit_placement.inc
index 662fdc3..7ad24e9 100644
--- a/constraints/constraint_digit_placement.inc
+++ b/constraints/constraint_digit_placement.inc
@@ -31,11 +31,14 @@ function password_policy_constraint_digit_placement_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_digit_placement_validate($password, $constraint, $uid) {
-  $number_of_digits = 0;
-  for ($i=0; $i<10; $i++) {
-    $number_of_digits += substr_count($password, "$i"); // help string count by sending it a string instead of an int
+  $chars = drupal_strlen($password);
+  $num = 0;
+  for ($i = 0; $i < $chars; ++$i) {
+    if (ctype_digit(drupal_substr($password, $i, 1))) {
+      $num++;
+    }
   }
-  if ($number_of_digits < (int)$constraint) {
+  if ($num < (int) $constraint) {
     return preg_match("/^(\d+)|(\d+)$/", $password) != 1;
   }
   return TRUE;
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..c1d127b 100644
--- a/constraints/constraint_lowercase.inc
+++ b/constraints/constraint_lowercase.inc
@@ -25,11 +25,12 @@ function password_policy_constraint_lowercase_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_lowercase_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = drupal_strlen($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_lower($password[$i]))
+  for ($i = 0; $i < $chars; ++$i) {
+    if (ctype_lower(drupal_substr($password, $i, 1))) {
       $num++;
+    }
   }
   return $num >= $constraint;
 }
diff --git a/constraints/constraint_punctuation.inc b/constraints/constraint_punctuation.inc
index a2cbef0..bef8d7e 100644
--- a/constraints/constraint_punctuation.inc
+++ b/constraints/constraint_punctuation.inc
@@ -25,11 +25,12 @@ function password_policy_constraint_punctuation_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_punctuation_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = drupal_strlen($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_punct($password[$i]))
+  for ($i = 0; $i < $chars; ++$i) {
+    if (ctype_punct(drupal_substr($password, $i, 1))) {
       $num++;
+    }
   }
   return $num >= $constraint;
 }
diff --git a/constraints/constraint_uppercase.inc b/constraints/constraint_uppercase.inc
index 070f68f..67b6ddf 100644
--- a/constraints/constraint_uppercase.inc
+++ b/constraints/constraint_uppercase.inc
@@ -25,11 +25,12 @@ function password_policy_constraint_uppercase_error($constraint) {
  * Password validation.
  */
 function password_policy_constraint_uppercase_validate($password, $constraint, $uid) {
-  $length = drupal_strlen($password);
+  $chars = drupal_strlen($password);
   $num = 0;
-  for ($i = 0; $i < $length; $i++) {
-    if (ctype_upper($password[$i]))
+  for ($i = 0; $i < $chars; ++$i) {
+    if (ctype_upper(drupal_substr($password, $i, 1))) {
       $num++;
+    }
   }
   return $num >= $constraint;
 }
